簡體   English   中英

fork(),exec和waitpid()

[英]fork(), exec and waitpid()

我讀了前面的問題fork和exec之間的差異,但它讓我有些疑惑。

當使用fork()並在子項上調用exec時, exec創建的新進程仍然是子進程嗎?

殺死父進程是否也殺死了孩子?

最頂層答案中顯示的繪圖/示例中,他調用wait / waitpid因為如果父進程首先終止,子進程終止,然后您獲得ls命令的部分輸出或沒有輸出,這是正確的嗎?

exec用新的過程映像替換當前正在執行的過程映像。 所以是的,孩子是一個孩子過程(實際上是同一個過程。)

不,殺死父母不會殺死孩子(孩子是孤兒 )。

殺死父進程不會殺死孩子。 當子進程調用exec函數時,它仍然是子進程。

在鏈接問題的示例中,流程圖粗略地描述了shell用於調用命令的過程。 除非命令是后台接地的,否則shell(父進程)將等待子進程終止,然后再繼續讀取命令。 否則,沒有必要等待孩子。

另見這個問題

當使用fork()並在子項上調用exec時,exec創建的新進程仍然是子進程嗎?

在對子進程調用exec時,新進程由子進程處理 子進程被exec調用替換。

殺死父進程是否也殺死了孩子?

當父進程通過讓OS發送信號而死(至少在Linux中)時,子進程可能會死掉,但除此之外它就會繼續存在。

他調用wait / waitpid,因為如果父進程首先終止,子進程終止,然后你得到ls命令的部分輸出或沒有輸出,這是正確的嗎?

您希望等待子進程(如您指向的示例中),以便:a)您可以在完成后正確終止子進程b)子進程可以訪問父進程的所有資源...這意味着如果您的孩子有一個由父母打開的文件句柄並且父級退出,但是孩子認為該文件只要它正在運行就會打開,就會發生不好的事情。

看一下這個快速示例:首先,查看流程列表的輸出:

mike@linux-4puc:~> ps
PID TTY          TIME CMD
18577 pts/2    00:00:00 bash
18643 pts/2    00:00:00 ps

然后運行這個小程序:

void main() 
{ 
    if(fork()){
      printf("parent print");
    }
    else
      while(1);
    printf("done");
}

在這里,您將讓父母打印消息“父打印”然后“完成”。 檢查完成后的“ps”列表,您會看到樹中的新進程掛出:

mike@linux-4puc:~> ps
PID TTY          TIME CMD
18577 pts/2    00:00:00 bash
18673 pts/2    00:00:02 a.out
18678 pts/2    00:00:00 ps

那個a.out是孩子,在父母終止時永遠坐在while循環中。

.. the new process created by exec is still a child right?

是的,它仍然是孩子。

Does killing the parent process kills the child too?

不會。如果父母因任何原因而死亡且孩子仍在執行,那么子進程將被init進程 (進程ID = 1)進程采用 ,該進程將成為此孤立進程的新父進程

calls wait/waitpid because if the parent process terminates first, the child...

waitpid / wait用於通知父節點的子節點狀態。 請注意,如果父進程有許多子進程,那么它通常會等待任何子進程,除非您指定特定子進程的進程ID。

暫無
暫無

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

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