fork / exec:child在尝试重定向stdin / stdout时退出

时间:2015-04-17 22:44:43

标签: c linux

我正在尝试使用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中 - 虽然无法解决原因(无法访问子代的符号)。

1 个答案:

答案 0 :(得分:1)

可能问题在于对execlp()的调用。

虽然从技术上讲,参数列表可能为空,但标准做法是始终在argv[0]中添加至少一个参数main(),并使用实际名称来调用程序。可能python程序使用arg0作为Py_SetProgramName()的参数,而不检查NULL

所以改为写:

execlp("child_process", "child_process", (char*)NULL);

另请注意,引自man execlp

  

参数列表必须以null结尾          指针,并且,由于这些是可变参数函数,因此必须强制转换此指针 (char *)NULL