簡體   English   中英

fork() 中的父 ID 和提前終止

[英]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. https://stackoverflow.com/a/395883/8199273
  2. https://stackoverflow.com/a/23697850/8199273

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.

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