Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建将stdin重定向到child的代理进程?_C_Linux_Bash_Pipe_Stdin - Fatal编程技术网

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

如何创建将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获取一对与管道连接的文件描

我想做一个代理进程来打开真正的进程

比如,如果我将linux的
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
游戏。