wait()用于进程子崩溃

时间:2013-06-12 16:15:14

标签: c fork pipe wait

我有以下程序

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;
}

fork调用我的脚本文件。脚本文件包含导致管道关闭的命令(有时)。如果管道被scipt关闭,则等待将导致程序崩溃。

如何在脚本关闭管道时避免程序崩溃?

3 个答案:

答案 0 :(得分:0)

错误将return -1替换为_exit(-1)

答案 1 :(得分:0)

你可能正在收到一个SIGPIPE信号但没有处理,导致异常。

尝试

signal(SIGPIPE, SIG_IGN);

并查看此question/answers了解详情(或google SIGPIPE)。

答案 2 :(得分:0)

您的代码在错误情况下泄漏文件描述符。如果出现错误,它还会关闭未初始化的文件描述符。

但是,只有当wait返回不同的pid时(如果你有更多的子节点运行)或者它被中断(在这种情况下它返回-1),你才会显示你正在显示的循环。所以对我而言,这看起来应该是正常的。孩子完成后,永远不会输入循环。 如果你认为程序崩溃了,你应该显示调用这个函数的代码。