Unix Ware平台上SIGCLD重复发送解决办法

首先问题是由于重新设定signal引起的,因为改变默认SIGCLD信号处理方式的时候,内核会去检测有无子进程需要被等待,所以在子进程里重新设定SIGCLD的处理方式时,肯定有子进程在等待,因为都已经触发进到signal的处理函数里面了。所以肯定有子进程在被等待。导致内核循环检测到SIGCLD信号。

for example

#include"apue.h"
#include <sys/wait.h>


void sig_cld (int);


int main(void)
{
        pid_t pid;


        if( signal(SIGCLD,sig_cld) == SIG_ERR)
                perror("signal error.");
        if( ( pid = fork() ) <0 )
                perror("fork error.");
        else if ( pid == 0)
                {
                        sleep(2);
                        _exit(0);
                }
        pause();
        exit(0);
}








void sig_cld (int signo)
{
        int status;
        pid_t pid;
        printf("catched SIGCLD\n");
        if( signal(SIGCLD,sig_cld) == SIG_ERR)
                perror("signal error.");
        if( (pid = wait (&status)) < 0 )
                perrpr("wait error.");


        printf("pid = %d\n",pid);
}



解决方法:将子进程里的signal(SIGCLD,sig_cld) == SIG_ERR)移动到wait之后。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值