免费注册 查看新帖 |

Chinaunix

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

关于SIGCHLD 信号的处理问题,请大家帮助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-03 13:51 |只看该作者 |倒序浏览
关于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出来的子进程,也就是
        说我捕捉了别的进程的子进程
这个问题困扰我好几天了,请高人指点

论坛徽章:
0
2 [报告]
发表于 2008-07-03 13:52 |只看该作者
补充一点,我的系统是:
linux redflag 5.0 + oracle10G

论坛徽章:
0
3 [报告]
发表于 2008-07-03 14:01 |只看该作者
你这个代码有问题

fork后面,没有父进程处理部分

父进程会继续fork

不停的fork

论坛徽章:
0
4 [报告]
发表于 2008-07-03 14:51 |只看该作者
我就是要父进程不做什么的东西,他睡眠10秒起来继续fork下一个子进程
而且照楼上的意思,即使父进程有活要干,那他总有干完的时候,他干完了不也一样要继续fork吗?

现在奇怪的就是为什么不对oracle进行操作,就可以实现;而对oracle操作的时候,把信号处理函数设置成SGI_IGN也可以
实现等待,为什么 “oracle操作 + sig_deal” 就不能实现等待了呢?

论坛徽章:
0
5 [报告]
发表于 2008-07-03 21:36 |只看该作者
当SIGCHLD 信号的处理改成 SIG_IGN 的时候,由kernel进行wait,子进程不会变为zombie,这时你调用wait的返回值是-1

论坛徽章:
0
6 [报告]
发表于 2008-07-04 09:44 |只看该作者
有谁能够解释 为什么 “oracle操作 + sig_deal” 就不能实现等待了呢?
我以前好像也尝试过oracle好像是会把signai操作大乱的,不知道大家有没有这样的感受

论坛徽章:
0
7 [报告]
发表于 2008-07-06 11:40 |只看该作者
怎么人气不旺啊,难道高手都不做技术了吗?自己顶一个,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP