[英]Parent id in fork() and early termination
我正在使用fork()
練習並行編程。 我希望每個進程的父 id 都是前進程的 id,但在我的輸出中顯示相同的 id。 為什么? 第二個問題是關於終止的。 有時輸出顯示所有進程,有時只有兩個或三個,有時只有一個。 為什么? 我知道父進程應該等待它的子進程,但如果不是我的問題怎么辦。 我的困惑是,當調用fork()
時,兩個進程都是在不知道它們的順序的情況下執行的,不是嗎?也許父進程終止了自己的執行。 但是它的孩子可以繼續運行到程序的其余部分或終止或其他什么? (從輸出中可以看出並不總是終止,也不總是完全正確)我不理解只顯示一個但有時是兩個或三個或不是全部的輸出。 我希望我能解釋我的問題。 看來,我做不到。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main (int argc, char *argv[]) {
pid_t childpid = 0;
int i;
for (i = 0; i < 3; i++)
if (childpid = fork())
break;
fprintf(stderr, "i:%d process ID:%ld parent ID:%ld child ID:%ld\n",
i, (long)getpid(), (long)getppid(), (long)childpid);
return 0;
}
輸出:
i:0 process ID:2783 parent ID:1954 child ID:2784
i:1 process ID:2784 parent ID:1 child ID:2785
i:2 process ID:2785 parent ID:1 child ID:2786
i:3 process ID:2786 parent ID:1 child ID:0
or
//how??
i:0 process ID:3016 parent ID:1954 child ID:3017
i:1 process ID:3017 parent ID:1 child ID:3018
i:2 process ID:3018 parent ID:1 child ID:3019
or
//how??
i:0 process ID:4079 parent ID:1954 child ID:4080
i:1 process ID:4080 parent ID:1 child ID:4081
or
//how??
i:0 process ID:3038 parent ID:1954 child ID:3039
預期輸出:
i:0 process ID:2783 parent ID:1954 child ID:2784
i:1 process ID:2784 parent ID:2783 child ID:2785
i:2 process ID:2785 parent ID:2784 child ID:2786
i:3 process ID:2786 parent ID:2785 child ID:0
您的輸出是不確定的,因為它取決於操作系統調度程序。 你的父母在分叉后退出的速度比孩子開始的速度要快,因此他們作為父母得到 1。
有關其他詳細信息,請參閱這兩個答案:
1)對於第二個問題,當子進程的父進程在它之前死亡時,子進程被稱為Orphan process
,在這種情況下,進程 init 成為所有此類的父進程,這就是為什么你得到 1 作為父 ID。
2) 對於第二個問題,一般不會發生這種情況,所以請檢查你的fork()
輸出值,檢查 fork() 是否失敗。
在執行 fork 的行,創建子進程,子進程獲得與父進程相同的進程上下文,在您的代碼中,父進程在打印后終止,子進程繼續循環並啟動另一個子進程(直到 i 變為 3),它本身現在是父進程進程執行打印語句。 我試圖在下面解釋它:
parent child
-----------------------------------------------
prints(i=0) parent child
-----------------------------------------------
prints(i=1) parent child
-----------------------------------------------
prints(i=2) Loop Terminates(fork dont get executed)
prints(i=3)
發生這種情況的原因是父進程在子進程調用 getppid() 之前退出。 這會導致子進程在 init 進程下重新成為父級。
根據操作系統的不同,您的結果會有所不同,因為對於在分叉后首先安排父級還是子級有不同的規則。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.