曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4948|回复: 0
打印 上一主题 下一主题

避免僵尸进程

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2009-7-24 00:09:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一个程序,派生一个子进程,但不希望等待子进程完成,并且不希望其成为僵尸进程,可以通过调用 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,从而收割第一个子进程的状态。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-4 16:14 , Processed in 0.070646 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表