[英]Pipe, Fork, and Exec - Two Way Communication Between Parent and Child Process
[英]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.