如果你想复制文件描述符,可以使用dup
和dup2
来实现该功能。
函数原型如下:
#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);
//Return: new file descriptor if OK, -1 on error
通过dup
返回的文件描述符是the lowest-numbered avaliable file descriptor
(可获得的数值最小的文件描述符)
dup2
第二个参数是用其指定新的文件描述符。如果newfd已经打开了,则先关闭其原有的文件。如果newfd
和oldfd
一样,则返回newfd
并且不会关闭该文件。
在调用newfd = dup(1);
数据结构如下。
如图可知oldfd
和newfd
共享同样的file table entry
复制描述符也可以通过函数fcntl
,该函数我们将会很快讲到。
实际上dup(oldfd)
等效于
fcntl(oldfd, F_DUPFD, 0);
类似的dup2(oldfd, newfd)
等效于
close(newfd);
fcntl(oldfd, F_DUPFD, newfd);
然而下面的例子中dup2和close+fcntl
不是完全一样的。
1. dup2
是原子操作,而后者不是
2. fcntl
和dup2
产生的errno
有一些是不同的。