2013-06-12 50 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)。对我来说,这看起来应该是一样的。当孩子完成时,循环永远不会被输入。 如果您认为程序崩溃,您应该显示调用此函数的代码。