簡體   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