如果你想复制文件描述符,可以使用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有一些是不同的。
文件描述符复制详解
本文详细介绍了如何使用dup和dup2函数复制文件描述符。dup返回一个可用的最小数值文件描述符,而dup2允许指定新的文件描述符,并在必要时关闭旧的描述符。此外,还介绍了这些操作如何与fcntl函数等效。
1359

被折叠的 条评论
为什么被折叠?



