2013-03-09 33 views
2

我是新的C和我一直在研究有關叉過去兩個星期後殺死父母,我必須解決這個問題,我的手術系統類:Ç叉,返回其PID

「你必須使用分叉創建一個「重量級」過程,然後第一個進程必須等待第二個(新的)返回其父ID,然後它必須殺死它的父級並完成「

我認爲說明是相當混亂,這是我的代碼到目前爲止(正如我所說,我是C新手,所以我一直在調查) 我的問題似乎是,父母甚至沒有等待子進程返回其ID,因爲在那之後,孩子正在殺死父母arent,所以我想我正在創建子進程,並且在運行時會終止父進程,而不是讓父進程等待子進程。 (這是我認爲對指令感到困惑的部分) 我想知道更多關於叉子和流程的信息,比如它們背後的邏輯,所以在編碼時我可以更加確定。 謝謝!

#include <sys/types.h> 
#include <wait.h> 
#include <unistd.h> 
#include <stdio.h> 


int main() { 
    pid_t idProceso; 
    int childState; 

    idProceso = fork(); 

    if (idProceso == 0){ 
     printf ("child id : %d. parent id %d\n", 
     getpid(), getppid()); 

      int parent = getppid(); 
      kill(parent, SIGKILL); 
      printf ("dead parent"); // not sure about it ?? 
      _exit(); 
    } 

    if(idProceso > 0){ 
     sleep (1); 
     printf ("parent id : %d. child id %d\n", 
     getpid(), idProceso); 

     wait (&childState); 

    } 

    return 0; 
} 
+2

說實話,這句話 - 即使在讀了兩遍之後 - 對我來說沒有任何意義。在所有情況下,我都可以想到已經退出的進程正在被殺死。 – drahnr 2013-03-09 18:26:43

+0

我不明白你應該做什麼,但父母沒有等待的原因是因爲它啓動了「睡眠」,但是孩子被設置爲立即殺死它,所以這樣做。 – teppic 2013-03-09 18:38:07

+0

你們都是對的,我的意思是,我認爲這句話很混亂,但這是老師給我們的方式。這就像: -create - 創建子進程 -the家長等待孩子 -the子進程殺死父(這是我很困惑的部分),並完成 – dlvx 2013-03-09 18:44:38

回答

1

根據您所提供的委派描述,我認爲教師或誰賦予它不會對任何英語或進程在Unix機器上的概念很好地處理教授。

你提出的解決方案是合理的,但我會刪除呼叫睡覺。 Childstate從未設置正確,並且不需要全部。此外,不要向家長髮送SIGKILL。 SIGKILL是嘗試終止進程的最後一種方法。我建議發送SIGTERM到父進程。如果您使用的是Linux計算機,則父進程可以使用sigaction安裝信號處理程序。在信號處理程序中,您可以打印一條好消息,如「從小孩收到終止信號」並呼叫退出。如果你這樣做,你的教授可能會對你的技能留下深刻印象,讓你通過分數。

如果沒有,我會問一個更好的問題。在實際解決問題之前,我不得不向教授提交語法和標點更正以供批准。

1

我的問題似乎是,家長甚至沒有等待 子進程返回其ID

無處在你的程序是孩子返回其ID父。唯一發生的通信是孩子向家長髮送一個SIGKILL信號。

,所以我認爲我創建子進程,並且當它運行它殺死 父末,不讓家長等待孩子 執行。

是的,你是對的,孩子會殺死父進程,通過發送一個SIGKILL信號,使用kill()函數,但父母實際上等待被孩子殺死。

wait (&childState); 

這使得這裏爲孩子終止父進程wait(掛在那裏),結束後,家長會移動,但在你的程序,而父等待孩子就會被終止,孩子本身會在等待期間終止父母。

我想知道更多關於叉和流程的信息,比如 背後的邏輯,所以在編碼時我會更加確定。

這是something值得一看。

0
$ ./foo.bin 
parent id : 6629. child id 6630 
child id : 6630. parent id 6629 
dead parentKilled 

我剛剛刪除了sleep(1),輸出看起來很合理。

+0

是這是同樣的結果我到目前爲止,我唯一想確定的是如果父母實際在等待(我在wait()之前和之後放置了一個printf,但是沒有一個正在打印) – dlvx 2013-03-09 19:02:22

+1

'parent id:.... 。child id ...'來自'parent'進程,並且沒有理由說明爲什麼父進程應該停止。所以它一直在等待。但是,如果您真的想要進入下面的級別,請使用調試器或呼叫跟蹤器。 – drahnr 2013-03-09 19:20:57