2014-05-07 61 views
0

我無法弄清楚這段代碼有什麼問題。這是一個Linux的盒子上的C.從c子進程中獲取退出狀態

它應該做的是殺死我創建的所有子進程,等待all退出,然後用pid,進程號(我創建)爲每個子進程打印一行,並且信號編號(應該是殺死9人)。

那麼我做錯了什麼?

void onalarm(int signo) { 
    int status[numberOfCores]; 
    printf("Recieved alarm signal\n"); 

    int cpu; 
    for (cpu = 0; cpu < numberOfCores; cpu++) { 
     kill(child_pid[cpu], SIGKILL); 
    } 

    for (cpu=0;cpu <numberOfCores;cpu++){ 
     waitpid(-1, &status[numberOfCores],0); 
    } 
    for (cpu=0;cpu < numberOfCores;cpu++){ 
     printf("pid = %i %ith child killed with signal ",child_pid[cpu],cpu); 

     printf("%i %s\n", WTERMSIG(status[cpu]), strsignal(WTERMSIG(status[cpu]))); 
    } 
    exit(0); 
+0

不應該在殺死後的第一個for循環中執行'waitpid'嗎? –

+0

當你運行它會發生什麼? – user3553031

+0

現在它只是我所期望的。它發送kill信號,然後waitpid等待它們全部退出,並將退出狀態保存到狀態數組中。使用kill數組之外的waitpid,它會將kill發送給所有子進程,然後等待它們全部退出,如果它位於第一個循環內部,它最終會做同樣的事情。唯一的問題是如果一個小孩在離開killpid循環後退出。但這是一次課堂練習,而且我們是這樣做的。 – user3088814

回答

1

我想出了我的問題是什麼。

 for (cpu=0;cpu <numberOfCores;cpu++){ 
    waitpid(-1, &status[numberOfCores],0); 

應該是。

 for (cpu=0;cpu <numberOfCores;cpu++){ 
    waitpid(-1, &status[cpu],0); 

知道它工作正常。感謝您幫助我思考。

+0

+1找出它:) – user3553031