2012-12-06 85 views
4

我試圖從子進程運行閃爍命令行。 例如是這樣的:linux fork - execl,執行的進程變成殭屍

int hangup() { 
write_on_display("line3", "   "); 
write_on_display("hide_icon", "DIALTONE"); 
write_on_display("hide_icon", "BACKLIGHT"); 

int pid = fork(); 
if (pid == 0) { 
    int res = execl("/usr/bin/twinkle", " ", "--immediate", "--cmd", 
      "answerbye", (char *) NULL); 
    _exit(0); 
} else { 
    perror("hangup"); 
    return 0; 
} 
return 1; 
} 

但閃爍變得殭屍:

10020 pts/1 Z+  0:00 [twinkle] <defunct> 
10040 pts/1 Z+  0:00 [twinkle] <defunct> 
10053 pts/1 Z+  0:00 [twinkle] <defunct> 
10064 pts/1 Z+  0:00 [twinkle] <defunct> 
10097 pts/1 Z+  0:00 [twinkle] <defunct> 
10108 pts/1 Z+  0:00 [twinkle] <defunct> 
10130 pts/1 Z+  0:00 [twinkle] <defunct> 

我試圖設置 信號(SIGCHLD,SIG_IGN); 但沒有成功。 其實我覺得孩子的過程在閃爍之前就消失了。

從類似的命令行運行閃爍:

twinkle --immediate --call 100 

不作殭屍 - 閃爍關閉正常。 我在那裏失蹤了什麼?

回答

7

父進程需要調用waitpid()與子進程ID。從鏈接的參考頁面:

所有這些系統調用都用於等待調用進程的子進程中的狀態更改,並獲取有關狀態已更改的子進程的信息。狀態變化被認爲是:孩子終止;孩子被一個信號阻止了;或者這個孩子被一個信號恢復了。 在終止的孩子的情況下,執行等待允許系統釋放與孩子相關的資源;如果未執行等待,則終止的孩子保持在「殭屍」狀態(參見下面的註釋)。

例如:

pid_t pid = fork(); 
if (0 == pid) 
{ 
    /* Child process. */ 
} 
else 
{ 
    /* Parent process, wait for child to complete. */ 
    int status; 
    waitpid(pid, &status, 0); 
} 
+0

僅有旁註:IIRC,execl'後'代碼將*不*被除非'execl'產生錯誤執行。 – Jite

+0

@Jite,正確。 exit(0);'_disappears_如果'execl()'成功。 – hmjd

2

是的,但我需要父母和孩子的工作同步。

其實我發現了我的錯誤。 所以,如果有人有類似的問題,像這樣的信號處理函數:

void catch_child(int sig_num) 
{ 
    /* when we get here, we know there's a zombie child waiting */ 
    int child_status; 

    wait(&child_status); 

} 

和 信號(SIGCHLD,catch_child)

在main()函數 一切正常

PP 這裏: is a very good explanation.

+0

這是一個好主意,可以在父進程中捕獲「子進程結束」信號,並在那裏「等待」它。它真的有用嗎? –