处理僵尸进程的一个方法结束-使用SIGCHLD信号

一、僵尸进程介绍

  • 在多进程开发的程序中,主进程要跟踪子进程的退出状态,当子进程运行结束时,内核不会立刻释放子进程进程表表项,而是等主进程读取子进程退出信息之后,才释放子进程的进程表表项。即父进程读取子进程退出信息之前,子进程结束之后,称该子进程为僵尸态。
  • 另外一种情况是当夫进程异常退出或者结束,os将子进程的PPID设置为1,即init进程,子进程的结束由init进程接管,这种情况下,父进程退出之后,子进程退出之前,该子进程称为僵尸态。

二、如何避免僵尸态

如果子进程处于僵尸态,内核资源将是极大的浪费,因此尽快结束僵尸态是非常重要。
方法:父进程调用函数,函数等待子进程结束,获取子进程的返回信息。

pid_t waitpid(pid_t pid, int* stat_loc,int options);
  • 此函数返回结束运行的子进程PID,并将子进程退出状态信息存储在stat_loc指向的内存中,options可以控制该函数的行为,比较常用的是将options设置为WNOHANG,即waitpid函数的调用是非阻塞的。
  • 非阻塞的含义是pid指定的子进程没有结束,立即就返回0,正常退出了就返回海子进程的PID。在事件已经发生了,非阻塞才是有效率的,因此最后的情况是,子进程结束之后(事件发生),调用waitpid函数。
  • 那么父进程怎么得知子进程退出了呢?
    当一个进程结束,它将发生一个SIGCHLD信号,父进程将捕获SIGCHLD信号,并在信号处理函数中调用waitpid函数结束子进程。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SIGCHLD信号是在一个子进程结束运行后,向其父进程发送的一个信号。这个信号可以让父进程知道子进程已经结束,从而可以回收子进程的资源。 当一个子进程结束时,操作系统会向其父进程发送SIGCHLD信号。父进程可以通过调用wait()或waitpid()函数来回收子进程的资源。在父进程中,可以通过设置一个信号处理函数来处理SIGCHLD信号,以便在子进程结束时自动回收资源。 下面是一个使用waitpid()函数来回收子进程资源的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> int main() { pid_t pid = fork(); if (pid == 0) { // 子进程 printf("child process\n"); exit(0); } else if (pid > 0) { // 父进程 printf("parent process\n"); int status; waitpid(pid, &status, 0); // 回收子进程资源 if (WIFEXITED(status)) { printf("child process exited with code %d\n", WEXITSTATUS(status)); } } else { // fork失败 perror("fork"); exit(1); } return 0; } ``` 在上面的代码中,父进程调用waitpid()函数来等待子进程结束,并回收子进程的资源。如果子进程正常结束,父进程就可以通过WIFEXITED(status)函数判断子进程是否正常结束,并通过WEXITSTATUS(status)函数获取子进程退出码。 需要注意的是,如果父进程没有调用wait()或waitpid()函数来回收子进程的资源,那么子进程就会成为一个僵尸进程,占用系统资源。因此,在父进程中一定要及时回收子进程的资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值