僵尸进程/wait/waitpid

  • 杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程。

  • 如果子进程退出,父进程还没有执行到wait,那边子进程就会由变为短暂的僵尸进程,直到父进程执行到wait,然后被父进程处理。

  • 当一个进程正常或异常终止的时候,内核就向其父进程发送SIGCHLD信号。父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用执行的函数。对于这种信号的系统默认动作是忽略它

  • 调用wait进程可能会发生的情况

  1. 如果其所有子进程都在运行,则阻塞。
  2. 如果一个子进程已经终止,正在等待的父进程获取到终止状态,则取得该子进程的终止状态立即返回。
  3. 如果他没有任何子进程,则立即出错返回。
  • 如果进程由于接收到SIGCHLD信号而调用wait,则可期望wait会立即返回(因为,SIGCHILD代表有子进程退出,所以不用阻塞等待)。但是如果在任意时刻调用wait则进程可能会阻塞。
  • 在信号处理函数中使用wait存在的问题:有多个子进程几乎同时退出,只产生了一个信号,所以信号函数wait可能了只处理一个子进程。使用循环wait会导致阻塞,如下
void sig_chld(int signo)
{
    int pid;
    if(signo == SIGCHLD) {
        while((pid = wait(NULL)) > 0)//如果子进程还未退出父进程会阻塞在sighandler中
            printf("process %d is exited\n",pid);
    }
}

  • 用waitpid可以避免阻塞。从本质上讲,系统调用waitpid和wait的作用是完全相同的,但waitpid多出了两个可由用户控制的参数pid和options,从而为我们编程提供了另一种更灵活的方式。
  1. pid>0时,只等待进程ID等于pid的子进程,不管其它已经有多少子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去。
  2. pid=-1时,等待任何一个子进程退出,没有任何限制,此时waitpid和wait的作用一模一样。
  3. pid=0时,等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid不会对它做任何理睬。
    pid<-1时,等待一个指定进程组中的任何子进程,这个进程组的ID等于pid的绝对值。
  4. options:options提供了一些额外的选项来控制waitpid,目前在Linux中只支持WNOHANG和WUNTRACED两个选项,最常用的就是WNONHANG来避免阻塞
  5. waitpid的返回值比wait稍微复杂一些,一共有3种情况:
    1、当正常返回的时候,waitpid返回收集到的子进程的进程ID;
    2、如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;
    3、如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在。当pid所指示的子进程不存在,或此进程存在,但不是调用进程的子进程,waitpid就会出错返回,这时errno被设置为ECHILD;
  • 因此上述代码可以改为如下的方式
void sig_chld(int signo)
{
    int pid;
    if(signo == SIGCHLD) {
        while((pid = waitpid(-1,NULL,WNOHANG) > 0)//暂时没有要处理的子进程就退出循环。
            printf("process %d is exited\n",pid);
    }
}
  • 杀死僵尸进程
  1. 重启计算机
  2. 杀死父进程

参考链接:
https://blog.csdn.net/qq739887227/article/details/82874309
https://blog.csdn.net/deniece1/article/details/102756586
https://www.cnblogs.com/nufangrensheng/p/3510101.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值