dup&dup2函数的使用
2015-07-20 23:41
603 查看
dup和dup2都可用来复制一个现存的文件描述符,使两个文件描述符指向同一个file结构体。
如果两个文件描述符指向同一个file结构体,File Status Flag和读写位置只保存一份在file结构体中,并且file结构体的引用计数是2。
如果两次open同一文件得到两个文件描述符,则每个描述符对应一个不同的file结构体,可以有不同的File Status Flag和读写位置。请注意区分这两种情况。
由dup返回的新文件描述符一定是当前可用文件描述符中的最小数值。对于dup2,可以用newfd参数指定新描述符的值。如果newfd已经打开,则先将其关闭。如若oldfd等于newfd,则dup2返回newfd,而不关闭它。
用dup和dup2实现重定向代码:
运行结果:
过程分析:
#include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int newfd);
如果两个文件描述符指向同一个file结构体,File Status Flag和读写位置只保存一份在file结构体中,并且file结构体的引用计数是2。
如果两次open同一文件得到两个文件描述符,则每个描述符对应一个不同的file结构体,可以有不同的File Status Flag和读写位置。请注意区分这两种情况。
由dup返回的新文件描述符一定是当前可用文件描述符中的最小数值。对于dup2,可以用newfd参数指定新描述符的值。如果newfd已经打开,则先将其关闭。如若oldfd等于newfd,则dup2返回newfd,而不关闭它。
用dup和dup2实现重定向代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/stat.h> #include <fcntl.h> int main(void) { int fd, save_fd; char msg[] = "test file\n"; fd = open("somefile", O_CREAT | O_RDWR, 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; }
运行结果:
cat@lenovo:~/Pro/linux_sys/0720/dup2$ ./a.out test file cat@lenovo:~/Pro/linux_sys/0720/dup2$ cat somefile test file
过程分析:
相关文章推荐
- NOI2015考试小结
- UILabel 个人学习总结(一)
- 我的C++笔记(函数部分)
- SASS
- Oracle自带的Universal Installer卸载存在问题
- MySQL-Slow-2
- spring:message tag and resouce bundle
- vector<string>
- 如何将一个Activity设置成窗口的样式
- 张珺 2015/07/17 个人文档
- 看opengl写代码(8) 使用缓冲区
- Android NDK环境配置
- ssd 应用场景
- HDU -- 3667 Transportation(最小费用最大流 )
- poj 3177 Redundant Paths 【无向图增加最少的边是图成为边—双连通】【tarjan求EBC + 缩点 统计度数为1的EBC】
- 【整理】--【字符设备】cdev_init()/cdev_alloc(),cdev_add(),cdev_del()
- 李陈铖求职安卓开发工程师简历20150720
- java-面向对象之继承(感言:经过第一天和Java中类的继承和接口的实现的接触,自己需要学习的还很多,还要从基础抓起,尽管有点迷糊,但学到很多很喜欢这种时光!加油!)下面是查到的相关资料以备查看。
- CentOS安装配置Samba
- CV数据集