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 关闭,等待将导致程序崩溃。

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

4

3 回答 3

0

on the error replace return -1 with _exit(-1).

于 2013-06-12T16:20:53.017 回答
0

您可能正在接收 SIGPIPE 信号而不是处理,而是导致异常。

尝试

signal(SIGPIPE, SIG_IGN);

并查看此问题/答案以了解详细信息(或 google SIGPIPE)。

于 2013-06-12T16:22:46.010 回答
0

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

但是,只有当 wait 以不同的 pid 返回(如果您有更多的孩子正在运行)或它被中断(在这种情况下它返回 -1)时,才会进入您显示的循环。所以对我来说,这看起来就像它应该工作的那样。当孩子完成后,将永远不会进入循环。如果您认为程序崩溃,您应该显示调用此函数的代码。

于 2013-06-12T16:24:17.217 回答