簡體   English   中英

C:dup和close-on-exec

[英]C: dup and close-on-exec

在一本關於C編程的(德語)書中(Linux-UNIX-Programmierung,由JürgenWolf)我發現了一個聲明,翻譯成英文如下(由我編號的句子):

在某些情況下,您可能需要復制文件描述符[1]。 這樣做的一個例子是,如果父進程想要​​與子進程交換數據,並且子進程通過使用exec*() [2]被新進程覆蓋。 在這種情況下,如果沒有dup() or dup2() ,將設置close-on-exec標志[3]。 設置此標志后,所有文件描述符都將變為無效(因為被新進程覆蓋) - 也就是說,它們不再存在[4]。 因此,父母和子女過程之間的溝通將被停止[5]。 另一方面,如果使用dup() or dup2()復制文件描述符,則刪除close-on-exec標志,並且新覆蓋的進程可以使用此文件描述符進行通信[6]。

我認為上段包含一些誤導性陳述甚至錯誤。

在句子[3]中,我不明白為什么不使用dup()dup2()會設置close-on-exec標志?

建議是錯誤的。 Close-on-exec僅設置在程序明確要求為close-on-exec的文件描述符上。

您可能選擇使用dup2的原因可能是:

  • 要執行的進程要求其I / O通過特定的文件描述符(通常為0,1和2,分別對應於標准輸入,輸出和錯誤流),或者
  • 無論出於何種原因,該過程將關閉一些文件描述符,並且您需要此fd超出要關閉的范圍。

描述也有點誤導 - 它只是新的描述符(即dup()dup2()的返回值),它具有close-on-exec未設置。 原始fd的close-on-exec狀態沒有變化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM