在一本关于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 标志会被设置?
答案 0 :(得分:2)
建议是错误的。 Close-on-exec仅设置在程序明确要求为close-on-exec的文件描述符上。
您可以选择使用dup2
的原因可能是:
描述也有些误导 - 它只是新的描述符(即来自dup()
或dup2()
的返回值),它具有未设置的close-on-exec。原始fd的close-on-exec状态没有变化。