Linux中dup函数和dup2函数

个人博客传送门

Linux 中进行文件描述符的重定向可以使用两个函数:dup函数和dup2函数,其中还有一个dup3函数,但是这个是Linux后面版本添加的,不是所有的Linux内核都支持,在这里不讨论。

在Linux系统中约定文件描述符 0、1、2 对应标准输入、标准输出、标准错误,默认开启。

dup()

#include <unistd.h>
int dup(int fd);

使用dup()函数的时候,参数是新的文件描述符期望指向的文件描述符。返回文件描述符表中最小的没有被使用的文件描述符。

如果我们的fd除了默认打开的0、1、2之外,没有被使用的。我们调用dup(1),那么最小的没有被使用的fd = 3 就会指向跟fd = 1的同一个文件表。

dup(1)

他的做法就类似以下做法:

fcntl(1, F_DUPFD, 0);   //fcntl函数用来改变已经打开文件的属性。

dup2()

#include <unistd.h>
int dup2(int fd, int fd2);

参数中fd指的是希望被改变的文件描述符,fd2是期望指向的旧的文件描述符。如果fd已经被使用,那么就关闭它。如果fd = fd2,返回fd2但是不关闭。
dup2()函数的做法跟dup一样,不同点是dup2()函数可以指定期望改变的fd,而不是去最小未被使用的fd。如果要我们的fd = 3也指向fd = 1的话。调用如下:

dup2(3, 1)

他的做法类似以下做法:

close(3);
fcntl(3, F_DUPFD, 1);

但是跟上面两个函数调用有点不同的是,dup2()函数的操作是原子性的。分两个函数调用的中间可能会出现其他函数的调用。


版权声明:本文为Mac_timmy原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。