函数dup2的理解

看《UNIX环境高级编程》时,看到书中对函数dup和dup2的描述时,总觉得书中对函数dup2有点没说清楚,不知道是我资质太低呢还是......

函数原型和原文描述

#include 
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 
#include 

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指向的文件表项建立映射关系。
如果用图来看就是这么个关系

函数dup2的理解_第1张图片
调用函数dup2前
函数dup2的理解_第2张图片
调用函数dup2后

你可能感兴趣的:(函数dup2的理解)