我有以下程序
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关闭,则等待将导致程序崩溃。
如何在脚本关闭管道时避免程序崩溃?
答案 0 :(得分:0)
错误将return -1
替换为_exit(-1)
。
答案 1 :(得分:0)
你可能正在收到一个SIGPIPE信号但没有处理,导致异常。
尝试
signal(SIGPIPE, SIG_IGN);
并查看此question/answers了解详情(或google SIGPIPE)。
答案 2 :(得分:0)
您的代码在错误情况下泄漏文件描述符。如果出现错误,它还会关闭未初始化的文件描述符。
但是,只有当wait返回不同的pid时(如果你有更多的子节点运行)或者它被中断(在这种情况下它返回-1),你才会显示你正在显示的循环。所以对我而言,这看起来应该是正常的。孩子完成后,永远不会输入循环。 如果你认为程序崩溃了,你应该显示调用这个函数的代码。