dup and dup2的剖析
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,是真的关闭了。
dup and dup2的剖析相关推荐
- Linux文件,文件描述符以及dup()和dup2()
一.Linux中文件 可以分为4种:普通文件.目录文件.链接文件和设备文件. 1.普通文件 是用户日常使用最多的文件,包括文本文件.shell脚本.二进制的可执行和各种类型的数据. ls -lh 来查 ...
- 用指针的观点来深入理解dup和dup2的用法
用指针的观点来深入理解dup和dup2的用法 作者:ejian 2007-09-17 网上有很多资料详细讲解了dup和dup2的用法,有讲得不错的,但总感觉理解起来还是有点困难,通过实践,我发现一种C ...
- linux之dup和dup2函数解析
理论介绍: 1. 文件描述符在内核中数据结构 在具体说dup/dup2之前,我认为有必要先了解一下文件描述符在内核中的形态.一个进程在此存在期间,会有一些文件被打开,从而会返回一些文件描述符,从she ...
- linux存储--dup和dup2函数解析(十八)
1.文件描述符在内核中数据结构 在具体说dup/dup2之前,我认为有必要先了解一下文件描述符在内核中的形态.一个进程在此存在期间,会有一些文件被打开,从而会返回一些文件描述符,从shell中运行一个 ...
- dup和dup2以及cat函数函数
今日命令: more filenamen //分屏显示filename 内容 od -c filename //使用二进制形式查看文件内容 dup和dup2也是两个非常有用的调用,它们的作用都是用来复 ...
- 【Linux系统编程】文件描述符的复制dup()和dup2()
00. 目录 文章目录 00. 目录 01. 文件描述符复制概述 02. 常用函数 2.1 dup函数 2.2 dup2函数 03. 案例实战 3.1 dup示例 3.2 dup2示例 04. 附录 ...
- 【Linux系统编程】 文件描述符的复制:dup()和dup2()
dup() 和 dup2() 是两个非常有用的系统调用,都是用来复制一个文件的描述符,使新的文件描述符也标识旧的文件描述符所标识的文件. 这个过程类似于现实生活中的配钥匙,钥匙相当于文件描述符,锁相当 ...
- 【转】Linux系统编程---dup和dup2详解
正常的文件描述符: 在linux下,通过open打开以文件后,会返回一个文件描述符,文件描述符会指向一个文件表,文件表中的节点指针会指向节点表.看下图: 打开文件的内核数据结构 dup和dup2两个函 ...
- 浅谈dup和dup2的用法
https://blog.csdn.net/u012058778/article/details/78705536 一.dup和dup2函数 这两个函数都可以来复制一个现有的文件描述符,他们的声明如 ...
最新文章
- linux端口找进程,Linux查看端口、进程情况及kill进程的方法
- 使用HTML5开发离线应用 - cache manifest
- 复杂版---JS获得某天是一年当中的第几天
- zepto为什么不支持animate,报animate is not a function
- Activity中finish()和onDestroy()的区别
- python文件命名 数字_python 批量修改数字类的文件名
- 接口Request传参的常用注解
- redis mysql 视图_Redis 可以用来做数据库吗?
- Vba_下载网络文件(图片)
- 正确的做事和做正确的事
- VS中读取NMEA数据进行定位精度分析
- java nginx 502_Nginx 502 Bad Gateway错误的解决方案
- 计算机常用英语词汇 短语,四级英语常用词汇短语
- python 解析excel模板_python 解析Excel
- 漏刻有时云守护数据可视化画质感知状态迭代说明文档
- 计算机系统时钟中断,什么是时钟中断时钟中断的举例
- Github项目(克隆,上传)简单git命令流程使用记录
- 树莓派+STM32人脸识别门禁系统(中)----- 树莓派部分
- 软件测试工作怎样修改本机IP,如何在命令行下更改IP地址
- 右中秋夜大观园即景联句三十五韵
热门文章
- python使用缩进来体现代码之间的逻辑关系-python使用缩进来体现代码之间的逻辑关系吗?...
- python对英语和数学的帮助-文科女生学Python:学过初中数学和英语就能懂的编程逻辑...
- python详细安装教程linux-在Linux上安装Python3
- python电脑安装-如何安装python
- python语法教程-Python语法教程总结规范
- python能在excel运行吗-用ExcelPython在Excel中调用Python
- python官方推荐的三本书-【数据分析】入门数据分析,你一定要看的三本书
- python语法基础知识总结-python语法基础知识
- python与php8-python和php对比
- python stm32-python学习(一)