【发布时间】:2014-04-10 01:31:48
【问题描述】:
这实际上是一个两步的问题:
究竟什么是文件描述符?我认为这是表示打开文件的最基本方式。但是既然dup2可以让两个不同的文件描述符指向同一个文件,那么什么是唯一的文件呢?
如果我在 exec 之前执行 dup2,那么整个程序就会被清除,它是否仍然具有相同的文件描述符表?重定向的文件描述符是否仍然被重定向?
【问题讨论】:
标签: c unix file-descriptor
这实际上是一个两步的问题:
究竟什么是文件描述符?我认为这是表示打开文件的最基本方式。但是既然dup2可以让两个不同的文件描述符指向同一个文件,那么什么是唯一的文件呢?
如果我在 exec 之前执行 dup2,那么整个程序就会被清除,它是否仍然具有相同的文件描述符表?重定向的文件描述符是否仍然被重定向?
【问题讨论】:
标签: c unix file-descriptor
是的。在调用exec 时会保留打开的文件描述符。来自execve man page(所有exec* 调用只是这个系统调用的包装):
默认情况下,文件描述符在
execve()中保持打开状态。标记为 close-on-exec 的文件描述符被关闭;见fcntl(2)中对FD_CLOEXEC的描述。
是的,file descriptor 是用户空间在进行系统调用时引用打开文件的方式。 (或套接字,或管道等)它们可以复制的事实并没有改变这一点。它们只是对同一个打开文件的多次引用。另见:
是的,如手册页引用中所述。
事实上,很多程序(包括你的 shell)都依赖于这个特性。如果不是这样,您的程序将在没有打开标准输入/输出/错误文件描述符的情况下启动!当 shell 运行一个程序时,forks,dup2 的打开 tty 文件描述符为 0,1,2,然后execve 是你的新程序。
【讨论】:
fork() 时,每个描述符都会被复制,并且子文件中的文件描述符指向与父文件中相应文件描述符相同的打开文件描述。而dup() 和dup2() 为您提供了对相同打开文件描述的另一个参考。请参阅open() POSIX 手册页(和相关页面)。