用dup2和dup产生一份file descriptor 的拷贝
在类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,t hen dup2 re turns 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
#include"fcntl.h"
#include
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 www.jx-jf.com
dup2的第二个参数是1,1是什么?STDIN_FILENO宏的本质就是1.这里还是那句话“fd2 is already open, it is first closed”
三个标准流在文件进程开始的时候肯定是都被打开的,already open是一定的事情 www.yzyedu.com
So。。。dup2非常“老实本分"的把STDOUT_FILENO在第二printf的时候关闭了
这个时候printf的输出就不会被打印在标准输出设备上面了,因为STDOUT_FILENO已经被关闭了!!
如果这个时候只要把第二个printf里面dup2的第二个参数改成大于2的数字就没事了。
code:
#include
#include"fcntl.h"
#include
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
closeand the fcntlthat could modify the file descriptors. (W edescribe
signals in Chapter 10.) The same problem could occur if a different thread
changes the file descriptors. (Wedescribe threads in Chapter 11.)
2. Ther eare s ome errnodifferences between dup2 and fcntl.
用dup2和dup产生一份file descriptor 的拷贝的更多相关文章
- 文件描述符file descriptor与inode的相关知识
每个进程在Linux内核中都有一个task_struct结构体来维护进程相关的 信息,称为进程描述符(Process Descriptor),而在操作系统理论中称为进程控制块 (PCB,Process ...
- [svc]linux中的文件描述符(file descriptor)和文件
linux中的文件描述符(file descriptor)和文件 linux为了实现一切皆文件的设计哲学,不仅将数据抽象成了文件,也将一切操作和资源抽象成了文件,比如说硬件设备,socket,磁盘,进 ...
- 近期编程问题——epoll failed:bad file descriptor
出现问题:epoll_wait:Bad file descriptor 原因:IO时间的socket描述符在epoll_ctl处理前就关闭了. 解决方法:不要在epoll_ctl之前关闭socket描 ...
- mongodb在ubuntu下的couldn‘t remove fs lock errno:9 Bad file descriptor的错误
按照官网上的安装方法: 在ubuntu系统下有可能出现如下错误: couldn't remove fs lock errno:9 Bad file descriptor 此时需要修改文件所有者 $ s ...
- shell 中最常使用的 FD (file descriptor)
在 shell 程式中,最常使用的 FD (file descriptor) 大概有三个, 分别是: 0 是一个文件描述符,表示标准输入(stdin)1 是一个文件描述符,表示标准输出(stdout) ...
- python print 在windows上 出现 Bad file descriptor error
先说一下情况,一个python写的采集程序,做成windows服务在windows上运行. 这个问题出现的挺奇特,本来一套采集程序,一个采集文件的时候没问题,两个采集文件的时候也没问题,当三个采集文件 ...
- windows pm2 启动nodejs失败:Error: EBADF: bad file descriptor, uv_pipe_open
windows下打开命令窗口,安装pm2:npm install pm2 -g pm2成功安装,在项目目录下用pm2启动服务:pm2 start index.js,结果启动失败,错误如下: .pm2\ ...
- fastDFS errcode:9 path:Bad file descriptor errcode:22 path:Invalid argument
fastDFS errcode:9 path:Bad file descriptor errcode:22 path:Invalid argument <error>status:4 er ...
- dpdk EAL: Error reading from file descriptor 23: Input/output error
执行test程序时输出: EAL: Error reading from file descriptor 23: Input/output error 原因: 在虚拟机添加的网卡,dpdk不支持导致的 ...
随机推荐
- jquery validate 自定义验证方法 日期验证
jquery validate有很多验证规则,但是更多的时候,需要根据特定的情况进行自定义验证规则. 这里就来聊一聊jquery validate的自定义验证. jquery validate有一个方 ...
- Java IO - BufferedReader & BufferedWriter
java.io 包提供丰富的 IO 读写功能,封装在不同的类里面.其中,使用 BufferedReader 和 BufferedWriter 可以方便地进行读.写文件的操作. 使用例子如下: impo ...
- android改动tab 导航 指示器颜色
我事实上想改动的上面的蓝色条条,改成红色. 这个问题实在是困扰我了太长时间.之前參照google的这个文章: https://developer.android.com/training/basics ...
- [RxJS] Creation operator: create()
We have been using Observable.create() a lot in previous lessons, so let's take a closer look how do ...
- [转] Java内部类之闭包(closure)与回调(callback)
闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域.通过这个定义,可以看出内部类是面向对象的闭包,因为它 不仅包含外围类对象(创建内部类的作用域)的信息,还自动拥 ...
- iis7 发布mvc 遇到的HTTP错误 403.14-Forbidden Web 服务器被配置为不列出此目录的内容
iis 7上发布mvc报错:403.14-Forbidden Web 服务器被配置为不列出此目录的内容 提示里面的解决方法是: 如果不希望启用目录浏览,请确保配置了默认文档并且该文件存在. 使用 II ...
- img图片元素下多余空白解决方案
在进行页面的DIV+CSS排版时,遇到IE6(当然有时Firefox下也会偶遇)浏览器中的图片元素img下出现多余空白的问题绝对是常见的对於 该问题的解决方法也是「见机行事」,根据原因的不同要用不同的 ...
- 在Github上面搭建Hexo博客(一):部署到Github
什么是Hexo Hexo是一个基于Node.js的静态博客程序,可以方便的生成静态网页托管在Github和Heroku上.并且有很多人为其制作了很多优秀的主题(theme),你可以根据自己的喜好进行设 ...
- HTML 控件和web控件 OnClientClick和OnClick OnServerClick区别
^_^ 本来对html控件,服务器控件的知识模模糊糊的.今天特地查了相关的知识. 下面是我写代码总结的. 这些事件 主要用于在客户端执行验证,然后决定是否执行服务端事件 (没接触之前就为此 ...
- [php基础]Mysql日期函数:日期时间格式转换函数详解
在PHP网站开发中,Mysql数据库设计中日期时间字段必不可少,由于Mysql日期函数输出的日期格式与PHP日期函数之间的日期格式兼容性不够,这就需要根据网站实际情况使用Mysql或PHP日期转换函数 ...