2011-05-25 106 views

回答

49

它爲文件描述符設置close-on-exec標誌,這會導致文件描述符在任何exec家族函數成功時自動(和原子地)關閉。

它還測試返回值以查看操作是否失敗,如果文件描述符有效,則該操作是無用的,因爲在有效的文件描述符中沒有該操作應該失敗的條件。

+2

請注意,它沒有任何關於刷新與文件描述符關聯的任何文件流('FILE *')。 FD_CLOEXEC的一個有效用途是在執行shell進程時關閉父進程已打開的日誌文件。請注意,POSIX 2008對於O_CLOEXEC有一個選項['open(2)'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html) - 所以你可以在打開文件,一旦它被廣泛使用,它將非常有用。 – 2011-05-25 14:11:55

+0

打開文件時自動設置標誌對於任何可能打開文件的線程程序而言都非常重要,而另一個線程可能正在執行外部程序。不幸的是,它只適用於'open'而不是'accept','socket','pipe'等...... – 2011-05-25 14:19:05

+0

是的 - 有設計問題添加O_CLOEXEC或等價物到另一個文件描述符創建函數(儘管'dup )'和'dup2()'當然不會受到影響)。你可能必須有一個額外的'模式'或'標誌'參數,這可能是爲什麼它沒有發生的新功能。如果你可以在套接字上使用O_CLOEXEC,那麼你可以假設'accept()'會在它返回的描述符上克隆該標誌。但是'socket()'和'pipe()'更復雜。 – 2011-05-25 14:27:55

23

它標記文件描述符,以便在進程或任何子進程調用exec*()函數系列函數之一時自動執行close() d。這對於防止將文件描述符泄漏到例如運行的隨機程序很有用。 system()

+0

這是一個安全問題嗎? – zach 2017-07-29 11:14:29

相關問題