目前只有一种文件描述符状态标志FD_CLOEXEC,它的作用就是标志着执行exec时该文件描述符会不会主动关闭。如果清除了该标志,就表明执行exec时该文件描述符不会关闭。系统的默认操作是在exec后仍保持这个文件描述符为打开状态。
dup、dup2和fcntl对文件描述符状态标志的影响
1.新描述符的执行时关闭标志总是由dup函数清除,这样当执行exec时新描述符保持打开状态。
2.先看一下dup2函数:int dup2(int fd, int fd2)。可由fd2指定新描述符的值,如果fd2已经打开了,则先将其关闭。如果fd2等于fd,则dup2返回fd2,而不关闭它(不改变fd的文件描述符状态标志)。否则fd2的文件描述符状态标志FD_CLOEXEC被清除,这样fd2在进程调用exec时是打开状态。
3.如果是用fcntl函数复制的文件描述符(F_DUPFD),新描述符有它自己的一套文件描述符标志,其FD_CLOEXEC文件描述符标志被清除(这表示该描述符在exec时仍保持有效)。如果是用F_DUPFD_COLEXEC负责文件描述符,则可以设置和新描述符相关联的文件描述符状态标志FD_CLOEXEC(置1)。
下面是程序:
首先,先把fd的文件描述符状态标志置1,然后调用dup,可以看见新描述符的文件描述符状态标志清0了。
其次,调用dup2函数,使它的fd2参数等于fd参数,可以看见函数直接返回fd,并且没有修改fd的文件描述符状态标志。
然后,再次调用dup2函数,使fd != fd2,可见新的文件状态描述符标志清0了。
再者,用参数F_DUPFD调用fcntl,可见新文件状态描述符状态标志清0了。然后用FD_DUPFD_CLOEXEC调用fcntl复制文件描述符,可见不管fd的文件状态描述符标志是1还是0,新文件状态描述符标志都为1。