【转】Linux系统编程---dup和dup2详解
正常的文件描述符:
在linux下,通过open打开以文件后,会返回一个文件描述符,文件描述符会指向一个文件表,文件表中的节点指针会指向节点表。看下图:
打开文件的内核数据结构
dup和dup2两个函数都可以用来复制打开的文件描述符,复制成功后和复制源共享同一个文件表。看下图:
执行dup后的内核数据结构
(1)dup函数
fd1=dup(fd);
fd1和fd共享一个文件表(对fd进行什么操作,fd1也会有相应的操作,fd和fd1是同步的)。
具体解释:
#inclue<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
#include<stdlib.h>
int main()
{
char buf[6]={0};
char buf1[6]={0};
int fd = open("file",O_RDWR|O_CREAT,0644);
if(fd < 0)
printf("open error");
printf("fd:%d\n",fd);
//输出fd=3;
write(fd,"hello,world",12);
lseek(fd,0,SEEK_SET); //将文件偏移量置为0,就是从第一个字符开始读(h开始)
read(fd,buf,5);
printf("fd:%s",buf);//输出hello
int fd1 = dup(fd);
read(fd1,buf1,5); //之前做的是对fd的读写操作,并没有对fd1做任何操作。但在这对fd1进行了读,如果输出数据。说明fd和fd1是同步的(fd做了什么相当于fd1也做了什么)
printf("fd1:%s\n",buf1); //输出,worl
//既然输出的是fd中的内容,说明fd和fd1共用一个文件表,读到的是,worl,而不是hello(我们在上面将偏移量从第一个字符开始,输出hello之后,fd的偏移量距离开始有5个字符当我们再次读fd的时候,它是从第6个字符开始读的,很明显,第6个是逗号,往后读5个,就是,worl),说明偏移量是一致的。(其实不用写偏移量,因为共用文件表就意味着文件偏移量也共用)
printf("fd1:%d\n",fd1);//输出fd1 = 4
//fd=3不等于fd1说明不共用同一个文件描述符。这也是dup和dup2的区别。
close(fd);
close(fd1);
return 0;
}
(2)dup2函数
fd2 = dup2(fd,fd1);
fd2用的fd1(第二个参数)的描述符,用的fd(第一个参数)的文件(和fd共享一个文件表,当然也共享文件偏移量)
强调第几个参数是因为如果你写成fd2=dup2(fd1,fd);那么fd2 =fd,和fd1共享同一个文件表。
#inclue<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
#include<stdlib.h>
int main()
{
int fd = open("file",O_RDWR|O_CREAT,0644);
if(fd < 0)
printf("open error");
printf("fd:%d\n",fd);
//输出fd=3;
int fd1 =open("text",,O_RDWR|O_CREAT,0644);
if(fd1 < 0)
printf("open error");
printf("fd1:%d\n",fd1);
//输出fd1=4;
int fd2 = dup2(fd,fd1);
printf("fd2:%d\n",fd2);
//输出fd2=4;
//fd1 =fd2=4;说明fd2使用了fd1的文件描述符。
char buf[12]="hello,world";
write(fd,buf,12); //我们对fd进行了写,并没有对fd2进行写
read(fd2,buf,12);//但是我们对fd2读的时候,如果没有写,怎么可能读出来呢
printf("fd2:%s\n",buf);//事实是读出来了
//输出fd2:hello,world //说明fd和fd2共用一个文件表。
lseek(fd,5,SEEK_SET);//距离开始偏移5位,说明下次读的时候是从第6个开始,注意我们是对fd进行偏移,没有对fd2偏移
read(fd2,buf,5); //但是如果读fd2结果是从第6个字符开始的
buf[5]=0; //如果不写这句,输出的buf是按照12个字符输出的。因为定义buf的时候数组中可以放12个字符。
printf("fd2:%s\n",buf);//输出fd2:,worl //说明fd2和fd共享文件偏移量。
close(fd);
close(fd2);
return 0;
}
dup和dup2的区别
dup:fd1= dup(fd);目标描述符使用了fd的文件表
dup2:fd2 = dup2(fd1,fd)目标描述符使用了fd1的描述符,使用了fd的文件表
转载于:https://www.cnblogs.com/linuxAndMcu/p/7668138.html
【转】Linux系统编程---dup和dup2详解相关推荐
- 【Linux系统编程】vfork() 函数详解
00. 目录 文章目录 00. 目录 01. vfork函数 02. fork和vfork区别 03. 父子进程地址空间 04. 附录 01. vfork函数 函数分析 #include <sy ...
- 【Linux系统编程】fork()函数详解
00. 目录 文章目录 00. 目录 01. 进程创建函数 02. 父子进程结构 03. 父子进程地址空间 04. 附录 01. 进程创建函数 #include <sys/types.h> ...
- 【Linux系统编程】fork() 函数详解
需要的头文件: #include <sys/types.h> #include <unistd.h> pid_t fork(void); 功能: 用于从一个已存在的进程中创建一 ...
- Linux系统编程18:超详解进程程序替换exec函数的一些用法
文章目录 (1)进程程序替换是什么 (2)exec-替换函数 (3)实例展示-了解exec函数的替换原理 A:execl和execv B:execlp和execvp C:替换自己的程序和execle ...
- linux系统里route -n不起作用,Linux系统中traceroute命令使用详解
Linux系统中traceroute命令可以追踪到网络数据包的路由途径.下面由学习啦小编为大家整理了linux系统中traceroute命令使用详解,希望对大家有帮助! Linux系统中tracero ...
- Linux系统中UID和GID详解
Linux系统中UID和GID详解 在Linux系统中,每个用户和组都有一个唯一的数字标识符,分别称为UID(用户ID)和GID(组ID).这些标识符用于在系统级别上对用户和组进行身份验证和授权,并且 ...
- Linux系统中的软件管理详解(下)—搭建网络软件仓库及第三方软件仓库
Linux系统中的软件管理详解(下) 5.软件仓库管理命令 a)dnf 命令: 管理软件仓库中的安装包 dnf repolist ##列出仓库信息clean all ##清除系统中已经加载的仓库缓存信 ...
- Linux系统上hdparm工具参数详解,硬盘检查、测速、设定和优化
Linux系统上hdparm工具参数详解,硬盘检查.测速.设定和优化 2012/07/25 hdparm, 硬盘 Linux命令相关 1 6,757 hdparm的功能:显示与设定硬盘的参数.hdpa ...
- linux的常用的wc命令,Linux系统中wc命令使用详解
Linux系统中wc命令是统计文件文本的字节数等并显示输出.下面由学习啦小编为大家整理了linux系统中wc命令使用详解,希望对大家有帮助! Linux系统中wc命令使用详解 Linux系统中的wc( ...
最新文章
- Spring基础专题——第一章(第一个Spring程序)
- codis3.2升级redis3.11到redis6.0.10调研
- “笨方法”学习Python笔记(2)-VS Code作为文本编辑器以及配置Python调试环境
- CTO丢给我《技术Leader的30条军规》:照着做,做不好滚回去写代码!
- 网站优化之如何稳固网站关键词排名?
- How to debug Custom Action DLL
- 做一个p2p打洞的C#程序
- oracle jpa字段加注释,JPA注释参考手册.doc
- Eigen(8)实例最小二乘法
- 简单的eda实验vga在linux系统中,EDA实验报告-VGA彩条显示.doc
- C++ 命名空间(namespace)
- oracle还原数据库方法,oracle数据库备份与还原(命令与方法)
- 基于梳状滤波器的的语音增强
- 本人累计多年整理的所有软件 需要请留言 适合毕业设计参考
- 用友T+、U8、NC系列,致远OA产品二次开发
- c语言实现多目标优化,MOPSO 多目标例子群优化算法
- matlab导入记事本数据库,怎么才能让记事本与MATLAB的数据交互?
- 调用腾讯优图OCR手写体文字识别接口
- 第1期-通过携程爬取机票价格
- 数据归一化、标准化和去中心化