簡體   English   中英

如果我在父母和孩子中分叉並執行,會發生什么?

[英]What will happen if I fork and exec in parent and child?

這是我的示例代碼,稱為server.c(為了簡單起見,已刪除了include)。

int main()
{
    for(int i = 0; i < 10; i++) {
        fork();
        execl("./client", "./client", NULL);
    }
    if (wait(NULL) == -1)
        perror("error with wait");
    return 0;
}

這是從上述程序執行的客戶端代碼。

int main()
{
    printf("This is the child with pid = %d from parent %d", getpid(), getppid());
    return 0;
}

現在,讓我解釋一下我認為將要發生的事情以及作為輸出實際得到的結果。

在服務器中,我們進入for循環。 在第一個迭代中,我們點擊fork()。 此時,有兩個過程,即父進程和第一個孩子進程。 現在,我們從這兩個過程中執行一個名為“客戶端”的程序。 此客戶端代碼僅打印一些信息。 因此,當我運行此服務器程序時,我應該得到正確的兩行嗎? 一條來自父母,另一條來自孩子? 但是我只打印了一行,使用strace之后,我發現只有父級正在打印出東西,而不是子級。 那為什么呢?

是因為父母死了而不能再收集孩子(這是正確的條件嗎?),因為孩子被執行了嗎? 如果是這樣,孩子會怎樣? 變成僵屍吧? 並會被init收集嗎? 即便如此,為什么在僵屍般結局之前,為什么不打印出那條線呢?

如果stdout連接到終端,則它應該是行緩沖的,因此不需要刷新。 程序關閉時,所有流都將在關閉時自動刷新。

也許您看到兩者都在同一行中打印? 試試這個代碼:

#include <stdio.h>
int main(int argc, char **argv) {
  printf("This is the child with pid = %d from parent %d\n", getpid(), getppid());
  return 0;
}

順便說一句,您在printf中缺少%d

您肯定應該得到兩行。

如果不是,則可能是由於運行程序的方式。 父母可能會打印並退出,如果此時您停止看或聽,您將會丟失孩子的信息。

因此,請確保直接從Shell終端而不是腳本的一部分,從IDE,編輯器或任何其他工具中運行腳本。

例如,這是./server; echo "Done"的輸出./server; echo "Done" ./server; echo "Done"

user ~ $ ./server; echo "Done."
This is the child with pid = 27904 from parent
Done.

這樣看起來就好像只有一行輸出。 但是,在此之后的行中,提示已返回,並且子進程在此之后寫了一些信息:

user ~ $ This is the child with pid = 27905 from parent

如果您以外殼程序等待的方式運行腳本,例如通過添加| cat | cat ,它會等到管道完全關閉后,您才能更清楚地看到兩者:

user ~ $ ./server | cat; echo "Done."
This is the child with pid = 27953 from parent
This is the child with pid = 27955 from parent
Done.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM