我想制作一个代理流程,打开真正的代理流程。
如果我将linux的espeak
重命名为espeak_real
,将我的应用重命名为espeak
。
espeak
打开espeak_real
并获得输出。
我希望能够:
我正在尝试用C语言(我猜这也可以使用原始bash)。
答案 0 :(得分:1)
我并不完全理解您的所作所为,但似乎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
}