僵尸进程解决方法

僵尸进程

1.  僵尸进程

摘抄一段

In UNIX System terminology, a process that has terminated,but whose parent has not yet waited for it, is called a zombie.

在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程。

 

2.  解决方法

 

1)忽略SIGCHILD信号,这个方式最简单,但有时会给其他程序带来影响

    struct sigaction sa;
    sa.sa_handler = SIG_IGN;
    #ifdef SA_NOCLDWAIT
    sa.sa_flags = SA_NOCLDWAIT;
    #else
    sa.sa_flags = 0;
    #endif
    sigemptyset (&sa.sa_mask);
    sigaction (SIGCHLD, &sa, NULL);

 

其中sigaction (SIGCHLD, &sa, NULL);换作sigaction (SIGCHLD, &new_sa, &old_sa);可以使用old_sa来保存之前的,之后可以再用sigaction (SIGCHLD, &old_sa, NULL);来恢复。

 

2)利用孙子进程来处理事务,fork两次

    pid_t pid;
    pid = fork();
    if (pid < 0){
        printf ("Error to fork while focus out/n");
    }else if(pid == 0){
        pid = fork();

        if (pid < 0){
            printf ("Error to fork while focus out/n");
        }else if(pid == 0){

            //孙子进程处理

            execlp ("gedit","gedit",NULL, NULL);

        }else{

            exit(0);    //子进程退出

        }
    }

    //父进程继续

 

3)使用waitpid或者wait来处理

其中waitpid(pid, NULL, WNOHANG);使用参数WNOHANG可以在子进程未退出时直接返回而不等待,但后面还是要继续判断处理。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值