簡體   English   中英

fork()sys_call中出現一些奇怪的結果

[英]Some strange result in fork() sys_call

我有以下代碼:

int main(){
  int i = 4, pid;
  while (--i){
    pid = fork();
    if (pid || (i&1))
      printf ("Boo %d\n", i);
  }
  return 0;
}

我理解代碼,但是我不明白為什么當我多次運行代碼時會得到不同的結果。

有人可以告訴我時間表如何不同嗎?

fork() ,接下來運行的進程(子進程或父進程)本質上是隨機的。 if對於所有父進程和一半子進程為true。

當每個孩子成為父母時,隨機性仍然存在。

Boo 3
Boo 3
Boo 2
Boo 2
Boo 1
Boo 1
Boo 1
Boo 1
Boo 1
Boo 1
Boo 1
Boo 1

這似乎很合邏輯。 但是在另一次運行中,我得到了:

Boo 3
Boo 2
Boo 1
Boo 3
Boo 2
Boo 1
Boo 1
Boo 1
Boo 1
Boo 1
Boo 1
Boo 1

在這種情況下,第一個過程直到另一個的偉大祖先才開始運行。

流程調度沒有可預測性。 那僅僅是操作系統的本質。 如果需要某種順序控制,則必須添加額外的代碼。 也許一些計時器,互斥鎖或主調度。

您必須了解,與程序的其余部分相比,printf的運行速度極其慢,並且printf內部僅一次執行一個進程-其他進程則等待訪問控制台。 這意味着打印命令實際上可以執行任何操作。

之前嘗試打印一些東西。 這意味着該過程在確保將其輸出顯示在屏幕上之前無法分叉。 在您的情況下,整個進程樹甚至可以在單個printf完成之前立即運行,所有進程都在等待控制台。 操作系統和printf實現可以在眾多因素(通常不是進程ID)上決定哪個優先,因此它們對printf的執行似乎是隨機的。

如果要確保執行順序,則需要使用信號量,方法是在輪到一個線程時將信號量從一個線程傳遞到另一個線程。

暫無
暫無

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

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