c fork的孩子ppid与父母的pid不匹配

时间:2015-07-06 04:53:50

标签: c fork

我对C.完全不熟悉 我尝试了下面的代码,期望孩子的ppid与父母的pid匹配,但事实并非如此。

int main() {


    int pid;

    printf("I'm process with pid=%d\n", getpid());

    switch (pid = fork()) {
        case -1:
            perror("fork");
            exit(1);
        case 0:
            printf("I'm the child process: pid=%d, ppid=%d\n", getpid(), getppid());
            break;
        default:
            printf("I'm the parent process: pid=%d, ppid=%d\n", getpid(), getppid());
            break;
    }

    exit(0);

}
> gcc -o fork fork.c 
> ./fork 
I'm process with pid=16907
I'm the parent process: pid=16907, ppid=6604
I'm the child process: pid=16908, ppid=1 // <-- expected ppid=16907, why 1?
>

我做错了什么?

3 个答案:

答案 0 :(得分:8)

父进程很可能已退出且不再存在。你可以在父母那里尝试一些延迟。

答案 1 :(得分:1)

&#39; init&#39; 这是在linux系统中运行的根进程有pid 1。

当进程的父级在其自身(即孩子)之前被终止时,该子进程将成为&#39; 进程并被根进程占用或正好在创建它的进程层次结构上方的进程(父进程)。

因此,这里它由在pid = 1的init下执行并执行。 因此,请延迟您的父流程以获得解决方案。

答案 2 :(得分:0)

就像其他人提到的那样,看起来子进程仍在执行时父进程已终止,从而使其(子进程)成为 orphan 。在退出前添加延迟可能会起作用。

但是,这样做的一种优雅方法是,父进程必须等待子进程终止。

这可以通过使用孩子的pid(waitpid()返回的值)调用fork()来实现。当控件退出此功能时,可以确保子进程已终止。另外,waitpid()返回进程终止的状态。根据返回的状态,您可以了解正常/异常的孩子终止情况。

这是执行此操作的代码:

int main() {


    int pid;
    int status = 0;

    printf("I'm process with pid=%d\n", getpid());

    switch (pid = fork()) {
        case -1:
            perror("fork");
            exit(1);
        case 0:
            printf("I'm the child process: pid=%d, ppid=%d\n", getpid(), getppid());
            break;
        default:
            waitpid(pid, &status, 0);
            if(WIFEXITED(status)
            {
                printf("Normal termination of child process %d\n", pid);
            }
            else
            {
                printf("Abormal termination of child process %d\n", pid);
            }
            printf("I'm the parent process: pid=%d, ppid=%d\n", getpid(), getppid());
            break;
    }

    exit(0);

}