fork()系统调用简单的来讲就是创建一个新的进程。
#include <sys/wait.h>
pid_t pid = 0;
pid = fork();
switch (pid)
{
/* child process */
case 0:
{
printf("\nchild process\n");
exit(0);
}
break;
case -1:
{
/* fork error */
printf("\nfork error\n");
exit(1);
}
break;
default:
{
/* parent process */
printf("\nparent process\n");
wait(NULL);
exit(0);
}
break;
}
代码这样写的原因在于fork()有一个极其特别的特点:一次调用,两次返回。
如果返回的pid<0,则说明fork fail了;
如果返回的pid=0,则说明这是从fork出来的child process中返回;
如果返回的pid>0,则说明这是从parent process中返回的,返回的pid即为child process的pid.。
那为什么要在parent process中调用wait()系统调用呢?
parent process调用wait()系统调用的目的在于当child process结束时,parent process可以回收child process的资源。
如果不调用wait(),当child process结束时,通过ps -A仍然可以找到该child process,
并且是处于<defunct>状态,也就是child process已经死掉,虽然其大部分资源已经释放,
但是仍然占用着一个进程描述符。
如果系统中有太多zombie process,那一定是有害的。
而且对于这种死掉的zombie process,kill -9 child_process_pid也无法将其杀死。
本文详细解析了fork()系统调用的功能与使用方法,包括如何通过pid判断子进程与父进程,以及父进程如何通过wait()系统调用来回收子进程资源,避免僵尸进程的产生。

1029

被折叠的 条评论
为什么被折叠?



