2012-03-06 152 views

回答

2

因爲在UNIX上最常用的功能之一是在進程之間管道流 - 如果設置了CLOEXEC標誌(子進程不能繼承文件描述符,例如:STDOUT_FILENO),則不能這樣做。

並且不,你不能在exec之後使用繼承的文件描述符(例如:標準流)。只要知道它的值(它是一個整數),您也可以使用任何繼承的文件描述符。這個值經常傳遞給子過程的參數(相當多的UNIX程序做到這一點),或者你可以做到這一點使用你選擇的任何IPC(進程間通信)機制的任何其他方式。

3

文件描述符可以使用通過exec調用;例如,Unix工具如何從shell獲得它們的標準輸入/輸出/錯誤fds。

關閉-ON-EXEC不是默認,因爲POSIX standard(和Unix傳統)要求相反的行爲:

文件描述符調用的進程映像開放應保持新的進程映像開放,除了對於那些設置了執行近距離執行標誌FD_CLOEXEC的人員。

+0

除輸入/輸出/錯誤fds之外是否還有其他用例? – 2012-03-06 12:43:49

+0

分叉不是可執行的,但。 – 2012-03-06 12:48:14

+0

糟糕,腦屁。那麼,在現代炮彈中支持任意的fd重定向,這必須是有理由引入的;儘管我從未發現自己有用。 – 2012-03-06 12:48:34

0

我不介意對此做出更完整的回答,但很容易猜測它是爲了向後兼容。必須在某個時候推出關閉執行標誌。在此之前存在的代碼不知道它,並且除非改變,否則將無法正常工作。因此它默認關閉。

不幸的是,由於這個原因,一個守護進程分叉cgi可能會使監聽套接字打開,並且如果cgi沒有退出或關閉它,守護進程將無法重新啓動。所以我同意你的看法,這不是一個很好的默認設置。