exec是否保留文件描述符

Xuf*_*eng 17 c unix file-descriptor

这实际上是一个两步问题:

  1. 究竟什么是文件描述符?我认为这是表示打开文件的最基本方式.但是由于dup2可以使两个不同的文件描述符指向同一个文件,那么它代表一个唯一文件是什么?

  2. 如果我在exec之前执行dup2,那么整个程序就会被删除,它是否还有相同的文件描述符表?重定向的文件描述符是否仍然被重定向?

Jon*_*art 18

是的.通过调用保留打开的文件描述符exec.从execve手册页(所有exec*调用只是这个系统调用的包装):

默认情况下,文件描述符保持打开状态execve().标记为close-on-exec的文件描述符将被关闭; 看到FD_CLOEXECin 的描述fcntl(2).

  1. 是的,文件描述符是用户空间在进行系统调用时引用打开文件的方式.(或套接字或管道等)它们可以复制的事实不会改变它.它们只是对同一个打开文件的多个引用.也可以看看:

  2. 是的,如手册页引用中所述.

事实上,许多程序(包括你的shell)都依赖于这个功能.如果不是这样,您的程序将在没有打开标准输入/输出/错误文件描述符的情况下启动!当shell运行程序时,它forkdup2打开的tty文件描述符到0,1,2,然后execve是你的新程序.

  • +1:此外,当你`fork()`时,每个描述符都被复制,并且子节点中的文件描述符指向与父节点中相应文件描述符相同的打开文件描述.`dup()`和`dup2()`为你提供了对同一个打开文件描述的另一个引用.请参阅POSIX(和相关页面)的[`open()`](http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html)手册页. (2认同)