我們知道fork()
會創建一個新的子進程,並將子進程的PID返回給父進程,並將0
返回給子進程。我在想,爲什麼他們這樣設計它(返回值),爲什麼返回值不是按照相反的順序。我認爲將父母的PID返回給父母並且0
也可以工作,每個孩子都會知道誰是其父母,並且每當它終止時,它就會向其各自的父母過程發出信號,這會產生什麼後果進場?我錯過了什麼嗎?爲什麼fork()的返回值不是相反的方式?
回答
之所以這樣,是因爲任何小孩都可以通過調用getppid
來獲得其父母的pid,而父母不知道孩子的pid是在沒有fork
的情況下告訴它的。
如果父母想要等待某個特定的孩子退出,它需要將孩子的pid傳遞給waitpid
。
我想如果會以相反的方式,那麼必須設計一個函數來獲取父母的孩子的pid。所以我認爲這不是它背後的真正原因。 –
@RajeevSingh一個進程可以有多個子進程,但只有一個父進程。所以'getppid'將總是返回調用進程的父進程的PID。即使你可以得到孩子的pid列表,你也需要知道哪個是哪個。 – dbush
子進程可以通過getppid()獲取父進程的PID。因此,父需要fork來獲得子進程的PID
如果他們設計得像fork()返回0給父進程,那麼在一個父進程的情況下就是創建多個子進程。
如果多個fork()創建一個子進程並且全部返回0到同一個父進程。無法識別單個子進程,並且設計爲將子進程ID返回給父進程。
- 1. 爲什麼fork()的返回值在C中有2個pid值?
- 2. 爲什麼$ urandom_range返回相同的值?
- 3. 爲什麼getCheckedItemPositions()返回反向真值
- 4. 什麼是最好的方式返回
- 5. 爲什麼COM接口爲相同的調用方法返回不同的值?
- 6. fork()返回值bug
- 7. 什麼是布爾值作爲返回值的方法?
- 8. 爲什麼fork爲child返回0,並返回父級的孩子的PID而不是VICE VERSA?
- 9. SASS random()總是返回相同的值,爲什麼?
- 10. 爲什麼TokenOrigin總是返回相同的值?
- 11. 爲什麼XPath count()總是返回相同的值?
- 12. 爲什麼rand()總是返回相同的值?
- 13. 爲什麼複選框總是返回相同的值?
- 14. 爲什麼ArrayList總是返回相同的值..?
- 15. 爲什麼返回的值不同?
- 16. 爲什麼IsDaylightSavingTime返回不同的值?
- 17. 爲什麼getViewTypeCount()返回不同的值?
- 18. 爲什麼UserPrincipal.Enabled返回不同的值?
- 19. 爲什麼返回的是id#而不是id的值?
- 20. 返回類型爲void的方法返回的是什麼?
- 21. 什麼是Web方法返回值的優秀設計模式?
- 22. 在Java中返回一對值的最佳方式是什麼?
- 23. 爲什麼這兩個函數不會返回相同的值?
- 24. 所有的fork函數返回值有什麼區別?
- 25. 「格式」的相反之處是什麼?
- 26. Notepad ++:什麼是JSFormat的「相反」格式?
- 27. 爲什麼HttpURLConnection.getHeaderFields()以相反的順序返回一個列表?
- 28. Properties.propertyNames()以相反的順序返回Enumeration - 爲什麼?
- 29. 爲什麼stdout.channel.recv_exit_status的返回值是'7'而不是'0'
- 30. 爲什麼Pry以不同的方式格式化這些返回值?
父母需要爲孩子「等待」,所以它需要孩子的PID。不是相反的。孩子可以很容易地獲得父母的PID。 –