2012-11-06 44 views
1

考慮以下幾點:創建叉()和exec(管後)

  1. 的小孩
  2. 子父進程使用exec系統調用
  3. 家長和孩子通過雙向通信運行另一個程序-directional管(在休息命名MAINPIPE)
  4. 孩子的服務器端口的綁定(如5000)

我的程序將正常運行FO llows:

如果孩子從客戶端收到某個消息,則向他的父母創建另一個雙向管道併發送/接收一些信息。

的問題是:

當我在孩子(使用pipe())創建管道並通過文件描述符到父(使用MAINPIPE),試圖讀取時,家長被「錯誤的文件描述符」錯誤信息從管道。

有什麼想法嗎?

編輯:

傢伙,

我的問題不是通過新管道的文件desciptors - 也就是說在孩子創造過程 - 母公司, 我已經做了,使用MAINPIPE,

但問題是:父母無法從新管道讀取,得到此錯誤消息「壞文件描述符」 似乎在父進程中關閉文件描述符!

回答

-1

文件描述符屬於一個進程。在你的情況下,孩子的過程。

在您的情況10中傳輸文件描述符的編號不會傳輸文件描述符本身。它只是傳輸數字10.數字10可以表示子進程中的文件描述符10,但作爲文件描述符屬於進程,在父進程中它是沒有意義的。子進程只在創建時從父進程繼承文件描述符。

創建子項後打開的任何文件描述符都不會在父項和子項之間共享。

如果需要實際的文件描述符傳遞給該另一個(例如父)進程,UNIX域套接字有這樣一個機制,定崗這裏包含了一些相關的鏈接。

3

在分岔前創建管道。然後管道在父母和子女都可用。不需要傳遞文件描述符。

下面是使用UNIX域套接字一個文件描述符發送從子到父庫的鏈接:

http://gitorious.org/libancillary/libancillary

,這裏是源:

http://gitorious.org/libancillary/libancillary/trees/master

當然,您必須調整以符合您的要求。

+0

正如我所說的我的孩子的過程是一個服務器,如果收到某些消息,那麼它應該創建另一個管他的父母 – user1711001

+0

改變你的工作流程。在分叉之前創建管道,並且僅在收到消息時發送數據。 –

+0

我不知道有多少客戶端連接到服務器,服務器必須有一個管道爲每個客戶端 – user1711001

0

有一種方法可以將文件描述符從孩子發送到父進程:您還沒有說儘管如此但是我不能說爲什麼它不起作用爲你。

需要注意的是,因爲你需要現有管道給送過來的文件描述符,你可以把多個邏輯在單一管流。這可能更容易,更便攜。


編輯:你還是拒絕顯示代碼您使用的是從送孩子到父母的文件描述符,但this question包含了一些相關的討論。你能確認你是否在做類似的事情嗎?

+0

MAINPIPE是在父進程中製作的管道,通過此管道,父子通信是可以的,當子(服務器)收到特定消息時,我在子進程中創建管道並將文件描述符傳遞給父進程,但是,從newpipe讀取,它會得到「錯誤的文件描述符」錯誤消息 – user1711001

+0

@ user1711001但是如何將文件描述符傳遞給父級?你只是將整數寫入已經存在的管道中?這不起作用,管道只處理數據傳輸。 – nos

+0

@nos是啊,我只是寫文件描述符整數MAINPAIPE和家長讀,你能解釋爲什麼它不會工作在單獨的答案嗎?謝謝, – user1711001