2015-10-14 62 views
1

我的最終目標是讓父進程將文本行傳遞給子進程,然後子進程將文本打印到stdout。當父母獲得用戶輸入並將其傳遞給孩子時,孩子在後臺「永久」運行。我更喜歡一個單獨的程序中的孩子。通過if語句將孩子和paretn區分開來,就像是fudge一樣混亂。在子調用exec()後使用pipe()

我正在查看管道,但是我不確定管道是否可以在子節點調用exec()到另一個程序後進行父/子之間的通信。這可能嗎?如果是這樣,有沒有可能讓我指點的例子?如果不是,那麼我可以使用什麼方法的IPC?

+0

https://www.cs.cf.ac.uk/Dave/C/node33.html –

+0

我想我跳過槍,很樂意刪除我的評論 - 這將使@阿蒙的顯得很奇怪。很高興看到你得到了答案。 – KevinDTimm

+0

@amon - 我將刪除我的評論(請參閱上面的評論) – KevinDTimm

回答

2

標準方案是讓程序作爲小孩執行而不需要管道,只需使用stdin/stdout。您通過dup2()將管道的相應端作爲fd 01(或者兩者都帶有用於雙向通信的兩個管道)來實現,對應於STDIN_FILENOSTDOUT_FILENO。之後,執行你的孩子程序。

當然, 「命名管道」,如果您需要stdin/stdout爲孩子的不同目的。

不過,如果你自己寫的兩個部分,你可能要考慮一下簡單的解決方案:

孩子和家長通過區分if語句是凌亂忽悠。

無論如何,您必須這樣做,至少要連接管道並調用exec()。只要創建單獨的代碼文件並根據需要調用像parent_main()child_main()這樣的東西(不管你喜歡怎麼稱呼它們)。

+0

謝謝,你的答案是我所需要的。謝謝。我喜歡你簡化父母的方式,不要像我原先想象的那樣混亂。 –

0

在exec *()函數之後,子級共享父進程的所有文件描述符。所以如果你在fork()之前創建一個管道,你可以在它們中讀寫fd。

通常的方法是:

  • 創建管道(讀FD,寫FD)
  • 叉()
  • 父:
    • 閱讀關閉FD(你不會從這裏從父母讀取)
    • 寫入數據寫入fd
    • 等待/死亡
  • 兒童
    • 接近寫FD(你會不會從孩子寫)
    • 讀通過FD
    • 等待讀取數據/死

無法看看你爲什麼要執行一個新的程序。如果真的需要,你必須使用標準的標準輸入/標準輸出(參見其他答案),或者讓一個程序接受一個fd(filedescriptor,一個整數)作爲參數,以便知道哪一個是管道。對我來說似乎不是很好。