如何创建将stdin重定向到child的代理进程?
我想做一个代理进程来打开真正的进程 比如,如果我将linux的如何创建将stdin重定向到child的代理进程?,c,linux,bash,pipe,stdin,C,Linux,Bash,Pipe,Stdin,我想做一个代理进程来打开真正的进程 比如,如果我将linux的espeak重命名为espeak\u real,将我的应用程序重命名为espeak。 espeak打开espeak\u real,我得到输出 我希望能够: 将其打印到控制台 将它的STDIN打印到另一个进程的STDIN 打印第二个进程的标准输出 我正试图用C语言来做这件事(我想用raw bash也有可能)。我不太明白你在做什么,但它似乎是fork、exec、pipe和dup2的组合 app可以使用pipe获取一对与管道连接的文件描
espeak
重命名为espeak\u real
,将我的应用程序重命名为espeak
。
espeak
打开espeak\u real
,我得到输出
我希望能够:
- 将其打印到控制台
- 将它的STDIN打印到另一个进程的STDIN
- 打印第二个进程的标准输出
我正试图用C语言来做这件事(我想用raw bash也有可能)。我不太明白你在做什么,但它似乎是
fork
、exec
、pipe
和dup2
的组合
app
可以使用pipe
获取一对与管道连接的文件描述符(写入一个管道的内容从另一个管道读取)。然后,它可以分叉,子对象可以执行
exec
app\u real
但是在
fork
和exec
之间,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
}
也许这个问题会帮助你linux没有exec(),我想把所有的STDIN都写给孩子。linux有多种
exec
,最简单的是execl
。如果您不使用stdin
,则孩子可以直接读取它(家长应关闭它)。您可以与其他FD一起玩dup2
游戏。