C语言 如何创建将标准输入重定向到子级的代理进程



我想创建一个代理进程来打开真正的进程。

就像我将 Linux 的espeak重命名为 espeak_real 并将我的应用程序重命名为 espeak 一样。 espeak打开espeak_real,我得到输出。

我想使以下成为可能:

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

我正在尝试用 C 语言执行此操作(我想原始 bash 也可以这样做(。

我不完全明白你在做什么,但它似乎是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
}

最新更新