Linux dup2详解
来源:互联网 发布:js封装对象 编辑:程序博客网 时间:2024/06/11 06:04
Unix高级编程 习题3.4
int fd=open("input.txt",O_RDWR|O_CREAT,644) ; int n; printf("%d\n",fd); int revalue=dup2(fd,0); printf("0--fd=%d\t return value=%d\n",fd,revalue); revalue=dup2(fd,1); printf("1--fd=%d\t return value=%d\n",fd,revalue); revalue=dup2(fd,2); printf("2--fd=%d\t return value=%d\n",fd,revalue);
运行结果:
3
0--fd=3 return value=0
input.txt 内容:
1--fd=3return value=1
2--fd=3 return value=2
下面内容出自:http://www.cnblogs.com/sdphome/archive/2011/04/30/2033381.html
dup
和dup2
都可用来复制一个现存的文件描述符,使两个文件描述符指向同一个file
结构体。如果两个文件描述符指向同一个file
结构体,File Status Flag和读写位置只保存一份在file
结构体中,并且file
结构体的引用计数是2。如果两次open
同一文件得到两个文件描述符,则每个描述符对应一个不同的file
结构体,可以有不同的File Status Flag和读写位置。请注意区分这两种情况。
#include <unistd.h>int dup(int oldfd);int dup2(int oldfd, int newfd);
如果调用成功,这两个函数都返回新分配或指定的文件描述符,如果出错则返回-1。dup
返回的新文件描述符一定该进程未使用的最小文件描述符,这一点和open
类似。dup2
可以用newfd
参数指定新描述符的数值。如果newfd
当前已经打开,则先将其关闭再做dup2
操作,如果oldfd
等于newfd
,则dup2
直接返回newfd
而不用先关闭newfd
再复制。
下面这个例子演示了dup
和dup2
函数的用法,请结合后面的连环画理解程序的执行过程。
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
{
int fd, save_fd;
char msg[] = "This is a test\n";
fd = open("somefile", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR);
if(fd<0) {
perror("open");
exit(1);
}
save_fd = dup(STDOUT_FILENO);
dup2(fd, STDOUT_FILENO);
close(fd);
write(STDOUT_FILENO, msg, strlen(msg));
dup2(save_fd, STDOUT_FILENO);
write(STDOUT_FILENO, msg, strlen(msg));
close(save_fd);
return 0;
}
重点解释两个地方:
第3幅图,要执行
dup2(fd, 1);
,文件描述符1原本指向tty
,现在要指向新的文件somefile
,就把原来的关闭了,但是tty
这个文件原本有两个引用计数,还有文件描述符save_fd
也指向它,所以只是将引用计数减1,并不真的关闭文件。第5幅图,要执行
dup2(save_fd, 1);
,文件描述符1原本指向somefile
,现在要指向新的文件tty
,就把原来的关闭了,somefile
原本只有一个引用计数,所以这次减到0,是真的关闭了。
- Linux dup2详解
- 详解dup和dup2
- linux dup()/dup2()函数
- dup2 linux C函数
- linux dup()\dup2()函数
- linux dup与dup2
- Linux dup() dup2()函数
- linux文件系统,dup2等
- linux dup/dup2
- linux dup dup2刍议
- linux dup2函数
- dup和dup2函数详解
- dup与dup2函数详解
- Linux管道编程技术:dup函数,dup2函数,open函数详解
- linux下dup和dup2
- LINUX下dup2的实现
- linux下dup2的实现
- Linux-dup和dup2函数
- matlab unique函数
- 序列化与反序列化
- 云存储加速
- RDBMS 数据库补丁集补丁号码快速参考-文档 ID 1577380.1
- CSS浏览器兼容问题集(二)
- Linux dup2详解
- Centering text in a table in Twitter Bootstrap
- 专业程序员必知必会的技巧:驯服复杂代码
- CSS浏览器兼容问题集 (三)
- UI 文本大小(长,宽)的设置
- Android apk 签名测试问题
- spring四种依赖注入方式
- Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅
- 代码简洁之道》读书笔记之四:边界、单元测试、类