美文网首页转载部分
函数dup2的理解

函数dup2的理解

作者: Allenkevin | 来源:发表于2017-04-21 19:51 被阅读58次

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

调用函数dup2前 调用函数dup2后

相关文章

  • 函数dup2的理解

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

  • Linux dup dup2函数理解

    在linux中,我们需要复制文件描述符,下面是我对文件描述符的理解 int dup(int fd); // 复制一...

  • [APUE习题]不使用fcntl实现dup2函数

    选自《Unix环境高级编程》习题3.2 编写一个与3.12节中dup2功能相同的函数,要求不调用fcntl函数,并...

  • dup和dup2函数实现

    dup unix-liked操作系统中,复制文件描述符的函数dup和dup2 由于题目要求不能使用fcntl函数,...

  • dup2函数示例

    1.函数功能 2.程序源码 4.编译源码 5.运行程序 6.查看文件数据

  • dup2

    dup2(int oldfd,int newfd);这个函数是复制文件描述符,将newfd描述符所对应的文件表 改...

  • 简单的进程间通信模型

    简单的进程间通信模型 关键字: fork, pipe, dup2, signal, SIGCHLD 2018082...

  • 尝试理解Swift中的@escaping

    要理解@escaping,首先需要理解closure, 要理解closure,首先理解匿名函数。 先理解匿名函数 ...

  • javascript函数,以及闭包的理解

    javascript函数,以及闭包的理解 深入理解javascript函数定义与函数作用域深入理解javascri...

  • Swift中的@escaping

    要理解@escaping,首先需要理解closure, 要理解closure,首先理解匿名函数。先理解匿名函数要在...

网友评论

    本文标题:函数dup2的理解

    本文链接:https://www.haomeiwen.com/subject/lhzdzttx.html