2010-04-09 39 views
-4

這段代碼有什麼問題?如何解決它?父進程轉到if或child進程?叉錯誤?怎麼修?

第一個代碼產生殭屍進程或第二個代碼或兩者或非?

#include <signal.h> 
#include <sys/wait.h> 
main() { 
    for (;;) { 
    if (!fork()) { 
     exit(0); 
    } 
    sleep(1); 
    } 
} 

你看這個代碼:

#include <signal.h> 
#include <sys/wait.h> 
main() { 
    for (;;) { 
    if (fork()) { 
     exit(0); 
    } 
    sleep(1); 
    } 
} 
+5

請不要只發布作業問題,並期望他們解決。嘗試自己解決它們,然後在遇到困難時詢問具體問題。 – danben 2010-04-09 21:54:02

+1

我的關於殭屍程序的問題產生了嗎?以及哪個孩子或父母去分段 – SjB 2010-04-09 21:59:00

回答

0

返回值

成功完成後,叉()應返回0給子過程,並應子進程的進程ID返回給父進程。這兩個進程都應該繼續從fork()函數中執行。否則,-1應返回到父進程,不應創建子進程,並應設置errno來指示錯誤。

=================

if (!fork()) equals to  if (0 == fork()) 

什麼你的意思是,成功創建不是創造了一個又流程?看起來像一個問題...

2

我不知道是什麼問題,因爲我不知道你想要做什麼。它所做的就是派生一個孩子,然後每秒退出(成功)。

當fork成功完成時,它將0返回給子項,並將子項的pid返回給父項。因此,這是第一個程序中的if body和第二個程序中的父項。

第一個創建無限數量的殭屍進程,因爲父母永遠活着,但永遠不會等待。第二種情況並不是因爲父母立即退出,所以孩子是孤兒,並被init採納。

編輯:解決問題的更新。

+1

我認爲這個問題是一個作業問題,粗略地沿着「第一代碼產生殭屍進程或第二代碼或兩者或非? – danben 2010-04-09 21:53:21

1

成功完成後,叉() 值0返回到子 過程和 子進程的進程ID返回給父 過程。否則,-1的值是 返回到父進程,否則 子進程創建,並且 全局變量errno設置爲indi- 表明錯誤。

該程序創建子進程每秒立即退出。

換言之,子進程「進入if」。您可以通過在if中添加printf語句來檢查。

4
  • 的代碼不是C99代碼
  • 代碼不包括正確的頭
  • 代碼叉一個孩子一次次;孩子立即退出(表示成功)
  • 該計劃不會停止,直到通過信號
  • 中斷由於代碼不等待它的孩子,而且它不會忽略SIGCHLD信號,過程累積殭屍 - 流程如果只有他們的父母等待他們,這將被清理乾淨。

    #include <stdlib.h> 
    #include <unistd.h> 
    int main(void) 
    { 
        for (;;) 
        { 
         if (fork() == 0) 
          exit(0); 
         sleep(1); 
        } 
        /* Unreached */ 
        return(0); 
    } 
    

替代代碼有父順利退出,而孩子上睡了一秒鐘,然後叉和自殺(留下一個新的子進程繼續進行)。

+0

第一次製作殭屍還是第二?或兩者 ?還是非? – SjB 2010-04-09 22:00:35

+0

@ sb2367:第一個代碼產生殭屍,因爲父母分出孩子並且永遠不會等待他們。第二不產生殭屍;父進程死亡,'init'進程(PID = 1)收集死體(更準確地說,shell在死時收集原始父進程; init進程收集剩餘的進程)。 – 2010-04-09 22:59:27

+0

我並不是想告訴你該怎麼做,但我認爲,當OP如此公然地尋找答案時,他可以在不必閱讀或理解的情況下寫下來並接通,這不符合SO的精神放縱他。 – danben 2010-04-09 23:14:22

0

我可以建議你註釋掉for循環並插入幾條printf語句(或者用gdb逐句)。這會讓你瞭解發生了什麼。或者用類似的方法綁定for循環:

int i = 0; 
for (i = 0; i < 5; i++) 

而不是使用無限循環,以便更容易理解/調試。

也讀了fork()以及它是如何工作的。然後,您不僅能夠回答這個問題,還能理解這些答案爲什麼適用,並且能夠避免在自己的軟件中犯錯誤。

我會建議離開睡眠聲明。

我懷疑這個作業的重點在於,您可以通過修改它並瞭解您的系統上做什麼和不做什麼是安全的。

1

從您的命令行中鍵入

man 2 fork 

,它會告訴你你想知道的一切。

相關問題