dup2这家伙

php中文网
发布: 2016-06-07 15:07:14
原创
2032人浏览过

在类Unix操作系统里面,。dup2和dup都通过系统调用来产生一份file descriptor 的拷贝。 dup对我来说还很简单 int dup(int filedes); dup2就有点犯迷糊了 int dup2(int filedes1,int filedes2); 其实这样declaration更好 int dup2(int oldfd,int newfd) 下面

在类Unix操作系统里面,。dup2和dup都通过系统调用来产生一份file descriptor 的拷贝。

dup对我来说还很简单

int dup(int filedes);
登录后复制

dup2就有点犯迷糊了

int dup2(int filedes1,int filedes2);
登录后复制

其实这样declaration更好

int dup2(int oldfd,int newfd)
登录后复制


下面是apue给出的解释

With dup2, we specify the value of the new descriptor with the fd2 argument.  

If fd2 is already open, it is first closed. If fd equals fd2,then dup2 returns fd2 without closing it.

Otherwise, theFD_CLOEXECfile descriptor flag is cleared forfd2, so that fd2 is left open if the process calls exec

我就比较疑惑,如果newfd是STDIN_FILENO,STDOUT_FILENO,STDERR_FILENO,(0,1,2)三个中的一个呢?

dup2是返回错误还是 “fd2 is already open, it is first closed”呢?


Just test it.


#include<apue.h>
#include"fcntl.h"
#include<stdio.h>
int main()
{
        int file_descriptor;
        if((file_descriptor = open("./text.t",O_RDWR)) < 0)
        {
                printf("error\n");
        }
        else
        {
                printf("file descriptor is %d\n",file_descriptor);
        }


        printf("dup2 return value:%d\n dup return value\
 %d\n",dup2(file_descriptor,0),dup(file_descriptor));


        printf("dup2 return value:%d\ndup return value\
 %d\n",dup2(file_descriptor,1),dup(file_descriptor));


        printf("dup2 return value:%d\ndup return value\
 %d\n",dup2(file_descriptor,2),dup(file_descriptor));


        close(file_descriptor);
        return 0;
}
登录后复制

Aha! Something interesting happened.

运行结果:

file descriptor is 3
dup2 return value:0
 dup return value 4

以上就是这段code的运行结果。嗯。。。我有三个printf语句,为啥米只答应了第一个,WTF。。。

问题都在第二个printf语句中调用的dup2

 dup2的第二个参数是1,1是什么?STDOUT_FILENO宏的本质就是1.这里还是那句话“fd2 is already open, it is first closed”

三个标准流在文件进程开始的时候肯定是都被打开的,already open是一定的事情。

So。。。dup2非常“老实本分"的把STDOUT_FILENO在第二printf的时候关闭了

这个时候printf的输出就不会被打印在标准输出设备上面了,因为STDOUT_FILENO已经被关闭了!!

如果这个时候只要把第二个printf里面dup2的第二个参数改成大于2的数字就没事了。

code:

#include<apue.h>
#include"fcntl.h"
#include<stdio.h>
int main()
{
        int file_descriptor;
        if((file_descriptor = open("./text.t",O_RDWR)) < 0)
        {
                printf("error\n");
        }
        else
        {
                printf("file descriptor is %d\n",file_descriptor);
        }


        printf("dup2 return value:%d\n dup return value\
 %d\n",dup2(file_descriptor,0),dup(file_descriptor));


        printf("dup2 return value:%d\ndup return value\
 %d\n",dup2(file_descriptor,10),dup(file_descriptor));


        printf("dup2 return value:%d\ndup return value\
 %d\n",dup2(file_descriptor,11),dup(file_descriptor));


        close(file_descriptor);
        return 0;
}
登录后复制

运行结果:

file descriptor is 3
dup2 return value:0
dup return value 4
dup2 return value:10
dup return value 5
dup2 return value:11
dup return value 6

这个时候就很清楚了。

Similarly,the call
dup2(fd, fd2);
is equivalent to
close(fd2);
fcntl(fd, F_DUPFD, fd2);

当然也不完全相同,不同点如下:


1. dup2 is an atomic operation, whereas the alternate form involves two function calls.  It is possible in the latter case to have a signal catcher called between the close and  the fcntl that  could  modify  the  file  descriptors. (We describe signals  in  Chapter  10.) The  same  problem  could  occur  if  a  different  thread changes the file descriptors. (We describe threads in Chapter 11.) 2.  There are some errno differences between dup2 and fcntl.


update 2014.04.10

今天有了“更深”的认识吧

<span>int dup2(int filedes1,int filedes2);</span>
登录后复制
是把filedes2指向的流关闭,而重定向到filedes1指向的流,此时filedes1和filedes2均指向同一个流。

就这么简单。。。。















相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号