2012-05-06 38 views
-1

我想做一個代理過程,打開真實的過程。如何創建將stdin重定向到子級的代理進程?

如果我將linux的espeak更改爲espeak_real而我的應用更改爲espeakespeak打開espeak_real我得到了輸出。

我要讓可能:

  • 版畫是標準輸入到控制檯
  • 版畫是標準輸入到另一個進程的標準輸入
  • 打印第二進程的STDOUT

我試圖在C做(我猜這也可能與原始的bash一樣)。

+0

'LN -s /斌/貓app' –

+0

也許這個問題會幫助你http://stackoverflow.com/questions/7383803/writing-to-stdin-並且從-stdout-unix-linux-c-programming – Baget

回答

1

我並不完全明白你在做什麼,但它好像是fork,exec,pipedup2的組合。

app可以使用pipe來獲得一對文件描述符,連接到一個管道(寫入一個的文件是從另一個文件讀取的)。
然後它可以叉,和孩子可以execapp_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 
} 
+0

linux沒有exec(),我也想把所有的STDIN都寫到子裏。 – blez

+0

Linux有多種'exec',最簡單的就是'execl'。如果你對'stdin'什麼都不做,孩子只能讀它(父母應該關閉它)。你可以用其他的fds來玩'dup2'遊戲。 – ugoren

相關問題