|
一个程序,派生一个子进程,但不希望等待子进程完成,并且不希望其成为僵尸进程,可以通过调用 fork() 两次的方法:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(void)
{
pid_t pid;
switch (pid = fork()) {
case -1:
perror("fork");
break;
case 0: /*第一个子进程*/
switch (fork()) {
case -1:
perror("fork2");
break;
case 0: /*第二个子进程*/
sleep(2);
printf("In second child; PPID = %ld\n", (long)getppid());
_exit(0);
default:
_exit(0);
}
_exit(0);
default:
if (waitpid (pid, NULL, 0) == -1)
perror("waitpid");
break;
}
return (0);
}
运行输出:
beyes@linux-beyes:~/C/base/fork> In second child; PPID = 1
|
说明:
在第一个子进程中做的第一件事是再次调用 fork 创建另一个子进程(该进程是第一进程的孙子进程)。
在第二个子进程中,在打印父进程 ID 之前调用 sleep 。进入睡眠是因为没有任何方法可以确定哪个进程将首先执行。如果没有 sleep,第二个进程将以设想的方式打印第一个进程的进程 ID,这可能会引起误导,因为该进程在打印消息不久后终止。由上面的输出看到,在第二个子进程睡眠期间,其父进程已经退出,其被第 1 号进程 init 收养,所以打印出 PPID = 1。
调用 fork 创建第二个子进程后,第一个子进程退出。
当返回到父进程后,在父进程里调用 waitpid() 并向其传递第一个子进程的进程 ID,从而收割第一个子进程的状态。 |
|