2013-06-12 91 views
0

我有以下程序等待()的過程中孩子崩潰

int external_apply(char *type) 
{ 
    int pfds[2]; 
    if (pipe(pfds) < 0) 
     return -1; 

    if ((pid = fork()) == -1) 
     goto error; 

    if (pid == 0) { 
     /* child */ 

     const char *argv[8]; 
     int i = 0; 
     argv[i++] = "/bin/sh"; 
     argv[i++] = "script_file.sh"; 
     argv[i++] = "apply"; 

     close(pfds[0]); 
     dup2(pfds[1], 1); 
     close(pfds[1]); 

     execvp(argv[0], (char **) argv); 
     exit(ESRCH); 

    } else if (pid < 0) 
     goto error; 

    /* parent */ 
    close(pfds[1]); 

    int status; 
    while (wait(&status) != pid) { 
     printf("waiting for child to exit"); 
    } 

    return 0; 

error: 
    close(pfds[0]); 
    return -1; 
} 

叉把我的腳本文件。腳本文件包含導致管道關閉的命令(有時)。如果管道被scipt關閉,等待將導致程序崩潰。

如何避免程序崩潰時,管是由腳本關閉?

+0

你所說的「崩潰」呢? Wait不關心管道,它只是等待孩子狀態改變。 – Devolus

+0

崩潰。我的意思是程序關閉時不顯示任何消息。事件dmesg不包含任何分段錯誤 – MOHAMED

+0

代碼的其餘部分在做什麼?看到我的答案更新。對我來說它看起來不錯,所以也許你的問題在別的地方。 – Devolus

回答

0

上的錯誤與_exit(-1)取代return -1

0

你可能會收到一個SIGPIPE信號,而不是處理,引起異常來代替。

嘗試

signal(SIGPIPE, SIG_IGN); 

看這question/answers的詳細信息(或谷歌SIGPIPE)。

0

您的代碼泄漏錯誤情況filedescriptors。它還會在出現錯誤時關閉未初始化的文件描述符。

但是,當有不同的PID等待返回(如果你有更多的孩子的運行),或就被打斷你呈現循環纔會進入(在這種情況下,它返回-1)。對我來說,這看起來應該是一樣的。當孩子完成時,循環永遠不會被輸入。 如果您認爲程序崩潰,您應該顯示調用此函數的代碼。