C:dup和close-on-exec

时间:2016-12-08 22:13:09

标签: c unix dup

在一本关于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 标志会被设置?

1 个答案:

答案 0 :(得分:2)

建议是错误的。 Close-on-exec仅设置在程序明确要求为close-on-exec的文件描述符上。

您可以选择使用dup2的原因可能是:

  • 要执行的进程要求其I / O通过特定的文件描述符(通常为0,1和2,分别对应于标准输入,输出和错误流),或
  • 该过程将关闭一些文件描述符,无论出于何种原因,您需要将此fd放在要关闭的范围之外。

描述也有些误导 - 它只是新的描述符(即来自dup()dup2()的返回值),它具有未设置的close-on-exec。原始fd的close-on-exec状态没有变化。

相关问题