2010-01-31 134 views
2

我已經做了一個程序,創建5個管道並在循環中分叉5個進程。當每個子進程被另一個程序重疊時,我已經設法將數據從父進程發送到每個子進程。通過讀取所以現在我能得到的是從父發送到管道中的數據發送數據從父母到孩子的過程,反之亦然C

// Child process - reads from pipe 
if (childpid == 0) { 
    dup2(fd[0], 0); // replace stdin with pipe input 
    execv("program", arguments); 

} else { // Parent process - writes to pipe 
    write(fd[1], buffer, strlen(buffer)+1); 
} 

:每個迴路以下方式進行

parent.c) STDIN_FILENO在子程序用execv(...)執行的程序中。

像這樣(program.c):

char *buffer = (char *)malloc(50); 
read(STDIN_FILENO, buffer, 50); 

我的問題不過是,我如何能夠將數據發送回父?我正在考慮使用dup2來重新替換標準輸出,但是我無法使其工作。至少在使用execv(...)之前我意識到這一點。


我不知道如果這解釋是足夠的,所以我可以做一個小圖片的文字:)

這是怎麼回事,現在:

  • 父 - >管
  • 管道 - >子進程1
  • 管道 - >子進程2
  • 管 - > ...
  • 管 - >子進程5

我希望它是這樣的。

  • 父 - >管
  • 管道 - >子過程1
  • 管道 - >子過程2
  • 管道 - > ...
  • 管 - >子進程5
  • 子進程1 - >父
  • 子進程2 - >父
  • ...
  • 子進程5 - >父

感謝幫助!

回答

0

我環顧了一下互聯網。看來你只能用管道來溝通一種方式。這是有道理的 - 從標準輸入和輸出到標準輸出。如果您希望在父進程和子進程之間進行雙向通信,請使用套接字。還有其他方法可以實現雙向IPC。我建議你瞭解更多關於進程間通信的知識。

一切順利。

2

看到這個unix programming faq這裏,看問題 1.4 1.5,也許使用內存映射允許父/子進程讀取從兩端/寫...有一個很好的指南,瞭解IPC here

編輯:由於特倫特在錯字指出一個小光點......我的意思是1.5 ...

希望這有助於 最好的問候, 湯姆。

+0

你的意思是問題1.5? – Trent 2010-01-31 15:39:18

+0

@Trent:呃,是的,我的意思是1.5 ...對不起....會相應地編輯這個......謝謝指出。 – t0mm13b 2010-01-31 15:44:28

3

管道是單向的,而不是雙向的,所以通用的解決方案是爲返回數據創建五個更多的管道(gak!)。然後,家長需要使用系統調用select()來知道哪些返回管道有數據可供讀取。

哦,我會寫

 
    dup2(fd[0], 0); // replace stdin with pipe input 
應該
 
    dup2(fd[0], 0); // replace stdin with output from pipe 
,反之亦然。

與其他回覆一樣,還有其他溝通方法可能更合適,具體取決於您嘗試實現的目標。

0

如果你想繼續使用管道,那麼做一組FD用於孩子 - >父母通信,一組用於父 - 孩子通信。因此,不要使用int fd [2],而是使用int toParent [2],toChild [2]。而不是dup2(fd [0],0),你有dup2(toChild [0],0); dup2(toParent [1],1)。

而不只是重複,但關閉你不使用的FD。

相關問題