看《UNIX环境高级编程》时,看到书中对函数dup和dup2的描述时,总觉得书中对函数dup2有点没说清楚,不知道是我资质太低呢还是......
函数原型和原文描述
#include <unistd.h>
int dup(int fd);
int dup2(int fd, int fd2);
原文对函数dup的描述比较好理解,这里只说函数dup2,下面这段话是书中的原文:
对于dup2,可以用fd2参数指定新描述符的值。如果fd2已经打开,则先将其关闭。如若fd等于fd2, 则dup2返回fd2,而不关闭它。否则,fd2的FD_CLOEXEC文件描述符标志就被清楚,这样fd2在进程调用exec时是打开状态。
问题出在哪里
疑惑出在这句话:如果fd2已经打开,则先将其关闭。
关闭什么,应该是关闭fd2和之前文件表项之间的映射关系,然后再让fd2和fd指向同一个文件表项。
举个例子,我让fd2的值取STDOUT_FILENO,然后使用printf()输出fd2的值,会发生什么
#include "apue.h"
#include <fcntl.h>
#include <unistd.h>
int main(void)
{
int fd, temp;
fd = open("./test.txt", O_RDWR);
temp = dup2(fd, STDOUT_FILENO);
printf("fd = %d, temp = %d", fd, temp);
return 0;
}
执行后,会发现printf()将内容输出到了文件test.txt里面,而不是输出到了显示器。本来STDOUT_FILENO是作为标准输出和显示器绑定的,现在调用函数dup2,会先解除它们之间的映射关系,然后让STEOUT_FILENO与文件描述符fd指向的文件表项建立映射关系。
如果用图来看就是这么个关系