首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >叉/exec:当尝试重定向stdin/stdout时子级退出

叉/exec:当尝试重定向stdin/stdout时子级退出
EN

Stack Overflow用户
提问于 2015-04-17 22:44:42
回答 1查看 388关注 0票数 1

我正在尝试使用叉/exec从我的程序中控制一个类似shell的进程,使用管道向进程写入命令并读取其输出。如果我创建进程而不进行任何重定向,它就会运行,而不会像预期的那样退出--我可以在ps输出中看到父进程和子进程。但是,一旦我添加了重定向代码,子程序似乎就会立即退出(它在ps中显示为“失效”)。我不知道如何确定子进程为什么退出(我没有看到它的任何输出),所以我很难诊断这个问题。

我的代码如下所示:

代码语言:javascript
运行
复制
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中--尽管还无法确定原因(不能访问子进程的符号)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-18 08:34:01

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

虽然从技术上讲,参数列表可能是空的,但通常至少要添加一个参数,即argv[0] in main(),并使用实际名称来调用程序。很可能,python程序使用这个arg0作为Py_SetProgramName()的参数,而不检查NULL

因此,请写:

代码语言:javascript
运行
复制
execlp("child_process", "child_process", (char*)NULL);

还请注意,引用了man execlp的话

参数列表必须以空指针结束,而且由于这些都是可变函数,因此必须将此指针(char *)NULL转换为

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29710632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档