分类: 系统运维
2012-03-28 12:58:11
一个存在的文件描述符可以由以下函数的其中一个复制:
#includde
int dup(int filedes);
int dup2(int filedes, int filedes2);
两者成功都返回新的文件描述符,错误返回-1。
由dup返回的新的文件描述符被保证为可用文件描述符里的最小数字。在dup2,我们用filedes2参数指定新的描述符的值。如果filedes2已
经被打开,它会首先被关掉。如果filedes与filedes2相等,那么dup2返回filedes2,但不关闭它。
函数返回的新的文件描述符与filedes参数共享同一个文件表项。
我们假设一个进程启动时,执行了newfd = dup(1);
并假设下一个可用的文件描述符为3(因为0、1、2都被shell打开,所以很有可能)。因为两个描述符指向同一个文件表项,它们共享同一个文件状态标志
--read、write、append等等--还有相同的当前文件偏移量。
每个描述符有自己的文件描述符标志。正如我们将在下节描述的那样,为新描述符为设的close-on-exec文件描述符标志总是被dup函数清除掉。
另一个复制描述符的方法是使用fcntl函数,我们会在3.14节讨论。事实上,函数调用dup(filedes);与fcntl(filedes,
F_DUPFD, 0);等价。类似地,函数调用dup2(filedes, filedes2);与close(filedes2);
fcntl(filedes, F_DUPFD, filedes2);等价。
在最后一种情况,dup2并不与close之后的fcntl完全相同。区别在于:
1、dup2是一个原子操作,而另一个调用了两个函数。后者可能会出现在close和fcntl操作之间,有一个信号捕获(signal catcher)被调用的情况。我们在第10章讨论信号。