- 论坛徽章:
- 0
|
关于SIGCHLD 信号的处理问题,请大家帮助
写的一段代码
signal( SIGCHLD, sig_deal );
while ( 1 )
{
pid = fork() ;
if ( pid == 0 )
{
if ( db_deal() != 0 )
{
........
}
exit( 0 ) ;
}
else if ( pid < 0 )
{
.......
}
sleep( 10 );
}
int sig_deal( int sig )
{
pid_t pid ;
int stat ;
switch ( sig )
{
case SIGCHLD:
while( (pid=waitpid( 0, &stat, WNOHANG )) > 0 )
{
.......
}
......
}
return ( 0 );
}
其中db_deal是一个对数据的操作函数,先连接数据库,然后对数据进行处理以后提交退出;
上面这段代码很奇怪,有以下几个问题:
1、如果我在db_deal 中不对数据库进行任何操作直接返回,那样的话在主进程里面设置的
sleep(10)就能够实现,如果在db_deal 中进行数据库操作,那么主进程就不进行等待,直接进行下一次循环;
2、但是如果我把 SIGCHLD 信号的处理改成 SIG_IGN 的时候,即使对数据库进行操作也能够实现等待;
3、对SIGCHLD的处理函数中,我使用的waitpid 函数获取的pid 存在一些不是我的主进程fork出来的子进程,也就是
说我捕捉了别的进程的子进程
这个问题困扰我好几天了,请高人指点 |
|