繁体   English   中英

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

[英]c fork's child ppid does not match parent's pid

我对 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?
>

我做错了什么 ?

父进程很可能已经退出并且不再存在。 您可以尝试在父母中延迟一些。

'init'是在 linux 系统中运行的根进程,其 pid 为 1 。

当进程的父进程在其自身(即子进程)之前终止时,子进程将成为“孤儿”进程并被根进程或创建它的进程(父进程)的层次结构之上的进程占用。

因此,这里它被 pid = 1 的 init 占用并在其下执行。 因此,延迟您的父进程以寻求解决方案。

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

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

这可以通过使用子waitpid()的 pid( fork()返回的值waitpid()调用waitpid()来实现。 当控制权从这个函数出来时,你可以确定子进程已经终止。 此外, 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);

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM