[英]As a process child, how to know which file descriptor is parents
我試圖編寫一個程序,該程序分叉並等待他的孩子完成,然后該孩子對輸入進行一些工作,然后以與父級相同的方式進行分叉,依此類推。
現在,我知道分叉將子文件描述符數組復制到子目錄,並且我應該關閉與父目錄關聯的文件描述符,但是我無法弄清楚哪些是父目錄。 我需要給我的孩子父母pid嗎?
在一個多小時的時間里,我一直在努力思考,我認為我有某種思維障礙,因為我無法得出結論。
TL; DR:作為子進程,我如何知道哪些文件描述符屬於我的父文件?
在fork
(並且在任何exec
函數之前 ),您的子進程具有與其父進程相同的狀態(除了fork
的結果(僅在子fork
中為0))。 因此, 您知道什么是文件描述符,因為您已對在parent&child中運行的程序進行了編碼。 在Linux上,您還可以閱讀/proc/self/fd/
目錄,請參閱proc(5) 。
您可能會在fork
和exec
之前關閉大多數文件描述符; 你可以編寫類似的代碼
for (int fd=3; fd<64; fd++) (void) close(fd);
我們從3開始,即STDERR_FILENO
在2之后,並且我們在64處任意停止,並且close
調用上的強制轉換為(void)
對讀者而言,我們並不關心close
...失敗。當然,如果您有例如一些pipe(7) -s在父子之間進行通信,則應注意避免關閉其相關的文件描述符。
(但是,像上述那樣閉合循環會導致口味變差和過時)
在一般情況下,你會在你的程序中設置的最文件描述符的close-on-exec標志小心(如的fcntl(2)上F_SETFD
操作和FD_CLOEXEC
標志,或者直接打開(2)與O_CLOEXEC
),那么execve的(2) (在fork
之后的大多數子進程中完成)將其關閉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.