我正在尝试使用fork / exec从我的程序控制类似shell的进程,使用管道将命令写入进程并读取其输出。如果我创建没有任何重定向的进程,它会在没有退出的情况下运行,如预期的那样 - 我可以在ps输出中看到父进程和子进程。但是,一旦我添加重定向代码,孩子似乎立即退出(它在ps中显示为“defunct”)。我不确定如何确定子进程退出的原因(我没有看到任何输出),所以我很难诊断问题。
我的代码看起来像这样:
int in[2], out[2];
FILE *in_fp, *out_fp;
pipe(in);
pipe(out);
if (fork()) {
close(in[0]);
close(out[1]);
in_fp = fdopen(in[1], "w");
out_fp = fdopen(out[0], "r");
// Here I'll use in_fp and out_fp to communicate with the child.
} else {
dup2(in[0], STDIN_FILENO);
dup2(out[1], STDOUT_FILENO);
close(in[0]);
close(in[1]);
close(out[0]);
close(out[1]);
execlp("child_process", NULL);
}
有谁知道为什么这可能不起作用,或者建议我如何获得有关子进程退出原因的更多信息?
编辑:所以strace显示子进程正在使用SIGSEGV崩溃,并且看起来像是在Py_SetProgramName中 - 虽然无法解决原因(无法访问子代的符号)。
答案 0 :(得分:1)
可能问题在于对execlp()
的调用。
虽然从技术上讲,参数列表可能为空,但标准做法是始终在argv[0]
中添加至少一个参数main()
,并使用实际名称来调用程序。可能python程序使用arg0
作为Py_SetProgramName()
的参数,而不检查NULL
。
所以改为写:
execlp("child_process", "child_process", (char*)NULL);
另请注意,引自man execlp
:
参数列表必须以null结尾 指针,并且,由于这些是可变参数函数,因此必须强制转换此指针
(char *)NULL