如何创建将stdin重定向到子进程的代理进程?

时间:2012-05-06 19:13:23

标签: c linux bash pipe stdin

我想制作一个代理流程,打开真正的代理流程。

如果我将linux的espeak重命名为espeak_real,将我的应用重命名为espeakespeak打开espeak_real并获得输出。

我希望能够:

  • 将STDIN打印到控制台
  • 将STDIN打印到另一个进程的STDIN
  • 打印第二个进程的STDOUT

我正在尝试用C语言(我猜这也可以使用原始bash)。

1 个答案:

答案 0 :(得分:1)

我并不完全理解您的所作所为,但似乎forkexecpipedup2的组合应该这样做。

app可以使用pipe来获取与管道连接的一对文件描述符(写入其中的文件描述符是从另一个中读取的)。
然后它可以分叉,孩子可以exec app_real 但是在forkexec之间,dup2可用于将您想要的任何文件描述符更改为0,1和2(但最接近真实的0,1,2)。 />

简短代码示例:

int pipe_fds[2];
pipe(pipe_fds);
if (fork()==0) {
    // Child
    close(fds[1]);    // This side is for the parent only
    close(0);         // Close original stdin before dup2
    dup2(fds[0],0);   // Now one side of the pipe is the child's stdin
    close(fds[0]);    // No need to have it open twice
    exec(...);
} else {
    // Parent
    close(fds[0]);            // This side is for the child only
    write(fds[1],data,len);   // This data goes to the child
}