2017-06-14 67 views
1

是否有任何方法可以創建一個新的進程,即使在exec之後也共享文件描述符表? clone(CLONE_FILES)將無法​​正常工作,因爲人網頁顯示:在兒童完成一個exec之後與子進程共享文件描述符表

如果一個進程共享一個文件描述符表調用的execve(2),其文件描述符表被複制(非共享)。

+2

這裏有什麼目標呢?爲什麼你需要一個實時共享的文件描述符表副本,一旦進程停止,即使是相同的可執行文件?乍一看似乎無意義,所以我懷疑這可能是[XY問題](https://meta.stackexchange.com/q/66377/322040)。 – ShadowRanger

+1

@ShadowRanger我正在爲Linux編寫一個x86用戶模式模擬器,並通過在模擬器的同時在ptrace下運行一個真實進程並對每條指令的CPU狀態進行比較來測試它。當模仿一個mmap調用的時候,我想把父母使用的FD和覆蓋edi的東西用在孩子身上。不是一個很常見的用例,這是肯定的。 – tbodt

+0

即使'execve()'之後未打開的文件描述符被共享,打開的文件描述仍然是共享的 - 是的,確實存在描述符和描述。閱讀['open()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html), ['dup2()']的POSIX規範(http://pubs.opengroup (''fork()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/fork.html), ['execve() '](http://pubs.opengroup.org/onlinepubs/9699919799/functions/execve.html)。 –

回答

2

這可以通過在子進程中注入負責接收FD的代碼的自定義代碼並更新子代的描述符表來完成。

子進程應該創建AF_UNIX插座,並在其上recvmsg(),而父進程應該重複和「流下來」所需的文件描述符使用SENDMSG() - 見here

+0

這正是我最終做的 – tbodt

相關問題