我想创建一个代理进程来打开真正的进程。
就像我将 Linux 的espeak
重命名为 espeak_real
并将我的应用程序重命名为 espeak
一样。 espeak
打开espeak_real
,我得到输出。
我想使以下成为可能:
- 将其
- STDIN 打印到控制台
- 将其 STDIN 打印到另一个进程的 STDIN
- 打印第二个进程的 STDOUT
我正在尝试用 C 语言执行此操作(我想原始 bash 也可以这样做(。
我不完全明白你在做什么,但它似乎是fork
、exec
、pipe
和dup2
的组合应该这样做。
app
可以使用pipe
来获取一对文件描述符,通过管道连接(写入一个的内容是从另一个读取的(。
然后它可以分叉,孩子可以exec
app_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
}