【问题标题】:fork/exec: child exits when trying to redirect stdin/stdoutfork/exec:尝试重定向标准输入/标准输出时子退出
【发布时间】:2015-04-17 22:44:42
【问题描述】:

我正在尝试使用 fork/exec 从我的程序中控制类似 shell 的进程,使用管道将命令写入进程并读取其输出。如果我在没有任何重定向的情况下创建进程,它会按预期运行而不退出 - 我可以在 ps 输出中看到父进程和子进程。但是,一旦我添加了重定向代码,孩子似乎立即退出(它在 ps 中显示为“已失效”)。我不确定如何确定子进程退出的原因(我没有看到任何输出),所以我正在努力诊断问题。

我的代码如下所示:

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 中 - 虽然还无法弄清楚原因(无法访问子进程的符号)。

【问题讨论】:

  • 回复:获取更多信息,strace -f是你的朋友; sysdig 更是如此。
  • 以防万一:我认为您希望父级中的 fdopen 而不是 fopen
  • 是的对不起 - 这是一个错字,我在实际代码中有 fdopen,已经更正了。
  • 您关闭了两次out[0] 而不是out[1],这也是错字吗?
  • 是的,抱歉 - 我在使用 VNC 时遇到剪贴板问题,所以我最终将其输入了 :)

标签: c linux


【解决方案1】:

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

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

所以改写:

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

另请注意,引用man execlp

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    相关资源
    最近更新 更多