[英]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.