这实际上是一个两步问题:
文件描述符究竟是什么?我认为这是表示打开文件的最基本方式。但由于dup2可以使两个不同的文件描述符指向同一个文件,那么它代表一个唯一的文件是什么?
如果我在exec之前执行dup2,那么整个程序就会被删除,它是否还有相同的文件描述符表?重定向的文件描述符是否仍然被重定向?
答案 0 :(得分:16)
是即可。通过调用exec
保留打开的文件描述符。来自execve
man page(所有exec*
调用只是此系统调用的包装器):
默认情况下,文件描述符在
execve()
内保持打开状态。标记为close-on-exec的文件描述符将被关闭;请参阅FD_CLOEXEC
中fcntl(2)
的说明。
是的,file descriptor是用户空间在进行系统调用时引用打开文件的方式。 (或套接字或管道等)它们可以复制的事实不会改变它。它们只是对同一个打开文件的多个引用。另见:
是的,如手册页引用中所述。
事实上,许多程序(包括你的shell)都依赖于这个功能。如果不是这样,您的程序将在没有打开标准输入/输出/错误文件描述符的情况下启动!当shell运行一个程序时,fork
s,dup2
打开tty文件描述符为0,1,2,然后execve
是你的新程序。