多进程编程中父进程如何回收僵尸进程

多进程编程中会可能会产生僵尸进程,这些僵尸进程不断蚕食系统资源,是系统变得越来越慢直至死亡,这种情况在并发模型中体现的尤为突出。这里分析下我们在多进程编程中如何解决这样的问题。

首先我们写一个例子:

#include

#include

#include

int main(int argc, char **argv)

{

int pid;

pid = fork();

if (pid > 0) {

printf("this is parent process, pid = %d\n", getpid());

while(1);

} else if (pid == 0) {

printf("this is child process, pid = %d\n", getpid());

printf("child process exit\n");

} else {

printf("create child process failed\n");

}

return 0;

}

本例中: 父进程创建子进程,进程完成移动工作后退出。运行效果如下:

this is parent process, pid = 3538

this is child process, pid = 3539

child process exit

使用ps -aux查看进程状态

此时父进程3538状态为R+而子进程状态为Z+,通过查看ps命令文档可的如下说明:

按照帮助文档中说明:R为运行态,Z为僵尸(zombie)态。

回收僵尸进程我们可以用如下方法:

使用wait()或waitpid()函数。

#include

#include

pid_t wait(int *status);

pid_t waitpid(pid_t pid, int *status, int options);

wait: 父进程调用等待任一子进程退出。等同于waitpid(-1, &status, 0);

waitpid:

使用waitpid回收僵尸进程,如下:

C++ Code

#include

#include

#include

#include

#include

int main(int argc, char **argv)

{

int pid, cpid;

pid = fork();

if (pid > 0) {

printf("this is parent process, pid = %d\n", getpid());

while(1) {

cpid = waitpid(-1, NULL, 0);

fprintf(stdout, "waitpid pid = %d: %s\n", cpid, strerror(errno));

sleep(1);

}

} else if (pid == 0) {

printf("this is child process, pid = %d\n", getpid());

printf("child process exit\n");

} else {

printf("create child process failed\n");

}

return 0;

}

运行结果:

this is parent process, pid = 4085

this is child process, pid = 4086

child process exit

waitpid pid = 4086: Success

waitpid pid = -1: No child processes

waitpid pid = -1: No child processes

ps -aux查看发现原来程序运行过程僵尸态的子进程已经不在了。

嵌入式、JavaEE、HTML5、安卓......多种课程免费试听!

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20180703A1AIYX00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券