爲什麼使用pipe()只有父和子進程可以進行通信有限制,爲什麼不是不相關的進程? 爲什麼一個進程的兩個孩子不能使用pipe()進行通信?爲什麼只有相關的進程只能使用pipe()(IPC)進行通信?
1
A
回答
2
沒有這樣的限制。任何兩個具有獲取管道每端的參考的方法都可以進行通信。一個進程甚至可以使用管道與自己進行通信。
任何進程都可以使用任何以下在進程之間傳遞文件描述符的通用方法來獲得對管道端點之一的引用。在這方面管道並不特別。
- 該過程本身被稱爲
pipe()
並且獲得兩端的文件描述符。 - 該進程通過套接字接收到的文件描述符爲
SCM_RIGHTS
輔助數據。 - 該進程使用Linux上的
/proc/<pid>/fd
等特定於平臺的方式從另一個任意進程獲取文件描述符。 - (可能有其他方法。)
- 該進程從使用上述方法之一獲取它的祖先(直接或間接)繼承文件描述符。
2
確實有限制。
管用fd
到讀/寫數據,fd
是每個進程,進程保持fd
表,兒童在叉繼承fd
表,並且每個繼承fd
指代相同open file
作爲父進程,這是由內核維護。
通過相同的管道進行通信的過程應當是相關的。
這意味着,該2個進程都應該意識到的管的2 fd
。
<TLPI>
說:
管道應該由一個共同祖先的一系列
fork()
調用,導致過程的存在之前創建。
相關問題
- 1. 爲什麼只能通過處理程序與UI線程進行通信?
- 2. 在python和haskell進程之間進行通信的ipc庫是什麼?
- 3. 使用IPC與Python和C#進行通信的最簡單方法是什麼?
- 4. 內部進程通信示例(IPC)
- 5. 通過共享內存使用Thrift進行IPC通信
- 6. 爲什麼使用pipe進行排序(linux命令)很慢?
- 7. 使用pipe/dup2與Python子進程通信
- 8. python IPC(進程間通信)爲Vista UAC(用戶訪問控制)
- 9. Popen與PIPE通信不會捕獲所有輸出的進程
- 10. 可以使用單個端口進行快速IPC通信嗎?
- 11. Python POSIX IPC - 作爲不同用戶運行的進程之間的通信
- 12. Unix進程PIPE
- 13. 你只能與一個子進程通信一次嗎?
- 14. 爲什麼waitpid()只對所有子進程返回1?
- 15. 爲什麼使用redis進行websocket通信?
- 16. 爲什麼只能在Android SDK QuickBlox上進行第一個視頻通話?
- 17. 如何在C#中進行進程間通信時進行進程間通信?
- 18. 內部進程只有WCF命名管道通信?
- 19. C中的信號進程間通信 - 爲什麼會失敗?
- 20. Electron IPC:爲什麼我的ipc信息沒有被接收?
- 21. 爲什麼OpenAM沒有使用OpenLDAP信息進行更新?
- 22. 爲什麼進程的StandardOutput只在進程終止後才接收數據?
- 23. 爲什麼我的jquery只能在頁面刷新後進入?
- 24. 使用node.js隊列進程,以便一次只能運行一個進程
- 25. 中進行觀察,只有
- 26. 如何通過兒童進行循環,但只能作爲MovieClip進行循環?
- 27. 使用管道進行過程通信
- 28. 使用CC2520進行通信
- 29. 使用進程間通信
- 30. 爲什麼evaluateJavaScript只能使用一次?
是的,這看起來是正確的。 – user1174114 2016-01-02 21:29:58
那麼也許你應該有upvoted! – 2016-12-08 06:00:08