讲师博文
多进程编程中父进程如何回收僵尸进程,经典中的经典 来源 : 未知     2018-06-27

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

首先我们写一个例子:

#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查看发现原来程序运行过程僵尸态的子进程已经不在了。已经不在了。

扫码申领本地嵌入式教学实录全套视频及配套源码

上一篇:进程标识符详解,让你对进程标识符有深入理解

下一篇:busybox文件系统制作步骤,带你快速学习

400-611-6270

Copyright © 2004-2024 华清远见教育科技集团 版权所有
京ICP备16055225号-5京公海网安备11010802025203号