我的最終目標是讓父進程將文本行傳遞給子進程,然後子進程將文本打印到stdout。當父母獲得用戶輸入並將其傳遞給孩子時,孩子在後臺「永久」運行。我更喜歡一個單獨的程序中的孩子。通過if語句將孩子和paretn區分開來,就像是fudge一樣混亂。在子調用exec()後使用pipe()
我正在查看管道,但是我不確定管道是否可以在子節點調用exec()到另一個程序後進行父/子之間的通信。這可能嗎?如果是這樣,有沒有可能讓我指點的例子?如果不是,那麼我可以使用什麼方法的IPC?
我的最終目標是讓父進程將文本行傳遞給子進程,然後子進程將文本打印到stdout。當父母獲得用戶輸入並將其傳遞給孩子時,孩子在後臺「永久」運行。我更喜歡一個單獨的程序中的孩子。通過if語句將孩子和paretn區分開來,就像是fudge一樣混亂。在子調用exec()後使用pipe()
我正在查看管道,但是我不確定管道是否可以在子節點調用exec()到另一個程序後進行父/子之間的通信。這可能嗎?如果是這樣,有沒有可能讓我指點的例子?如果不是,那麼我可以使用什麼方法的IPC?
標準方案是讓程序作爲小孩執行而不需要管道,只需使用stdin
/stdout
。您通過dup2()
將管道的相應端作爲fd 0
或1
(或者兩者都帶有用於雙向通信的兩個管道)來實現,對應於STDIN_FILENO
和STDOUT_FILENO
。之後,執行你的孩子程序。
當然, 「命名管道」,如果您需要stdin
/stdout
爲孩子的不同目的。
不過,如果你自己寫的兩個部分,你可能要考慮一下簡單的解決方案:
孩子和家長通過區分if語句是凌亂忽悠。
無論如何,您必須這樣做,至少要連接管道並調用exec()。只要創建單獨的代碼文件並根據需要調用像parent_main()
和child_main()
這樣的東西(不管你喜歡怎麼稱呼它們)。
謝謝,你的答案是我所需要的。謝謝。我喜歡你簡化父母的方式,不要像我原先想象的那樣混亂。 –
在exec *()函數之後,子級共享父進程的所有文件描述符。所以如果你在fork()之前創建一個管道,你可以在它們中讀寫fd。
通常的方法是:
無法看看你爲什麼要執行一個新的程序。如果真的需要,你必須使用標準的標準輸入/標準輸出(參見其他答案),或者讓一個程序接受一個fd(filedescriptor,一個整數)作爲參數,以便知道哪一個是管道。對我來說似乎不是很好。
https://www.cs.cf.ac.uk/Dave/C/node33.html –
我想我跳過槍,很樂意刪除我的評論 - 這將使@阿蒙的顯得很奇怪。很高興看到你得到了答案。 – KevinDTimm
@amon - 我將刪除我的評論(請參閱上面的評論) – KevinDTimm