在C中重定向标准输入和输出(Linux)

时间:2011-10-21 16:27:26

标签: c stdout stdin

我正在尝试将标准重定向到我的流程要创建的流程中,因此我可以与此流程进行双向通信。

基本上,我正在尝试用C语言完成Python的popen2()。

我无法在此找到任何内容,因为每个人似乎都在他们的示例中使用fork(),这很方便,因为您可以在子项中创建管道,fork,然后使用dup()来更改然而,stdin和stdout,在我的情况下,我不是在分叉,我实际上正在执行一个shell命令,我希望能够与它进行通信。

3 个答案:

答案 0 :(得分:1)

如果不分支进程,则无法执行shell命令。它是由系统之类的函数在内部完成的,你应该明确地捕获stdin / stdout。在您之前创建的dup2中通过pipe分叉和设置stdin / stdout之后,使用shell调用exec,使用“-c”参数和shell命令你想分叉。

答案 1 :(得分:0)

有些unix使popen (3)支持双向管道(包括Mac OS在内的大多数BSD;不知道我的头脑中的Linux),这使得这很容易,但这不是必需的,只有其他支持popen的一个方向。对于那些您必须使用pipe (2)forkexec建立两个单向管道。

答案 2 :(得分:0)

Python的popen2确实派了一个shell进程,并使用popen(3)实现。

popen(3)是POSIX标准的一部分,在Linux下受支持。但请注意,popen只能创建单向通信(只读或只写)。 popen(3)是管道(2)系统调用的包装器。

如果要在同一描述符上同时执行输入和输出,则进入套接字领域。您可以实现UNIX套接字(本地通信),请参阅unix(7)以获取详细信息 - 手册页中也有适当的C示例,因此我不会在此处重新发布。

相关问题