免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4513 | 回复: 16
打印 上一主题 下一主题

父进程不停地收到SIGCHLD信号?不知为什么,贴上代码,在线等! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-11-07 23:33 |只看该作者 |倒序浏览
#include <stdio.h>;
#include <stdlib.h>;
#include <signal.h>;
#include <sys/types.h>;
#define MAX 2
int childnum, num;

child_run()
{
  printf( "child[%d]\n", getpid() );
  sleep(2);
  return ;
}

sig_child()
{
  int status;

  printf( "child exit\n" );
  signal(SIGCHLD, sig_child);
  waitpid(0, &status, WNOHANG);
  childnum--;
  return ;
}

main()
{
  pid_t pid;
  childnum = num = 0;

  signal(SIGCHLD, sig_child);
  while(1){
    if( childnum >;= MAX ) { sleep(1); continue; }
    sleep(1);
    if(num++>;5) return ;
    pid=fork();
    if(pid<0) { printf("fork err\n"; return(-1); }
    else if(pid==0) { child_run(); exit(0); }
    else if(pid >;0) {
      childnum++;
    }
  }
  return ;
}

编译运行
a.out >; 00 &

Segmentation fault(coredump)

core了

head 00
child[272750]
child exit
child exit
child exit
child exit
child exit
child exit
child exit
child exit
.......  (27182个child exit)
child child[160948]


请高手解答,谢谢!

论坛徽章:
0
2 [报告]
发表于 2004-11-08 09:55 |只看该作者

父进程不停地收到SIGCHLD信号?不知为什么,贴上代码,在线等!

这样的全局变量在父、子进程中不能共享。子进程对全局变量的修改不会影响父进程的变量。

论坛徽章:
0
3 [报告]
发表于 2004-11-08 14:03 |只看该作者

父进程不停地收到SIGCHLD信号?不知为什么,贴上代码,在线等!

头文件少了一个#include <sys/wait.h>;,你看这样改写怎么样?
#include <stdio.h>;
#include <stdlib.h>;
#include <signal.h>;
#include <sys/types.h>;
#include <sys/wait.h>;
#define MAX 2
int childnum, num;

void  child_run(int singo)
{
printf( "child[%d]\n", getpid() );
sleep(2);
}

void sig_child(int singo )
{
int status;

printf( "child exit\n" );
signal(SIGCHLD, sig_child);
waitpid(0, &status, WNOHANG);
childnum--;
}

main()
{
pid_t pid;
childnum = num = 0;
int i=SIGCHLD;
signal(SIGCHLD, sig_child);
while(1){
if( childnum >;= MAX ) { sleep(1); continue; }
sleep(1);
if(num++>;5) return ;
pid=fork();
if(pid<0) { printf("fork err\n"; return(-1); }
else if(pid==0) { child_run(i); exit(0); }
else if(pid >;0) {
childnum++;
}
}
return ;
}
tcpc2003 该用户已被删除
4 [报告]
发表于 2004-11-15 16:16 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2004-11-16 11:54 |只看该作者

父进程不停地收到SIGCHLD信号?不知为什么,贴上代码,在线等!

给点建议:
对于SIGCLD信号:

  1. void sig_child(int singo )
  2. {
  3.   int status;

  4.   while(waitpid(-1, &status, WNOHANG)>;0)
  5. {
  6.      your code!
  7. }

  8.   signal(SIGCHLD, sig_child);
  9. }
复制代码

论坛徽章:
0
6 [报告]
发表于 2005-01-27 12:24 |只看该作者

父进程不停地收到SIGCHLD信号?不知为什么,贴上代码,在线等!

APUE关于信号一章说得很清楚,调用signal时,系统会检测是否有子进程等待wait,在信号处理程序中也是如此。
楼上的代码是对的,或者用sigaction代替signal

论坛徽章:
0
7 [报告]
发表于 2005-01-27 16:24 |只看该作者

父进程不停地收到SIGCHLD信号?不知为什么,贴上代码,在线等!

进程各种形式的阻塞(sleep(),pause(),select(),read()....)都有可能被信号唤醒。
你应该把sleep()封装一下,过滤掉干扰信号。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
8 [报告]
发表于 2005-01-27 16:35 |只看该作者

父进程不停地收到SIGCHLD信号?不知为什么,贴上代码,在线等!

APUE里10.7节有关于这个问题的详细描述
SIGCLD(大部份的系统里与SIGCHLD是一样的)的信号处理是特殊的

论坛徽章:
0
9 [报告]
发表于 2005-04-21 10:57 |只看该作者

父进程不停地收到SIGCHLD信号?不知为什么,贴上代码,在线等!

原帖由 "yuxh" 发表:
APUE里10.7节有关于这个问题的详细描述
SIGCLD(大部份的系统里与SIGCHLD是一样的)的信号处理是特殊的

小弟正在看10.7节,十分的郁闷,对“SIGCLD的配置设置为捕捉,内核立即检测是否有子进程准备好被等待”一直无法理解。难道在程序还没有调用fork的时候内核也会无检测是否有子进程吗?好像没有这个必要吧???

论坛徽章:
0
10 [报告]
发表于 2005-04-21 15:54 |只看该作者

父进程不停地收到SIGCHLD信号?不知为什么,贴上代码,在线等!

就要沉了,自己顶一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP