linux dup用法,Linux:dup和dup2文件描述符及函数解析,dupdup2
Linux:dup和dup2文件描述符及函数解析,dupdup2
一、文件描述符
1.1 文件描述符概念
我们知道在Linux下一切皆文件,因此我们需要一个东西对这些文件进行管理,此时就需要文件描述符来管理了。
文件描述符简称fd,对于内核而言,所有打开的文件都要通过文件描述符来引用。文件描述符是一个递增的非负整数,一旦当我们打开或者创建一个新的文件的时候,内核向进程返回一个文件描述符。
文件描述符一般有以下三个性质:
每个进程都具有自己的一个递增的文件描述符,如果我们关闭了一个文件描述符所占用的正整数,则这个正整数有可能被其它文件描述符所占用。 单个进程能同时打开的文件描述符数量受到limit设置所限制,可以用ulimit -a查看最大文件描述符个数。进程最大打开文件数目默认是1024个。 根据规定,所有的shell启动新的程序的时候,总是将0、1、2这三个数字的文件描述符打开为标准输入、标准输出,标准错误。
1.2 文件表项
1.2.1文件表简介
由于内核在对所有打开的文件都维护一个文件表项,也叫打开文件表。在文件表项中,拥有状态标志位和文件偏移量以及vnode指针,表格中各个条目被叫做打开文件句柄,一个打开文件句柄存储了与一个打开文件相关的全部信息,它有以下信息:
当前文件偏移量(read()和write()会更新这个偏移量,lseek()可以直接修改文件偏移量) 打开文件所用的状态标志(open()的flags参数) 文件访问模式 (调用open()所设置的只读、只写、读写模式) 与信号驱动相关的设置 文件类型和访问权限 指向所有者的锁列表 文件的各种属性,包含了文件的大小和不同类型操作的时间戳(A\C\M) 文件的inode对象的应用
由于文件表有很多字段,我们重点关注其中的三个字段:
状态标志位 文件偏移量 Vnode指针
1.2.2文件表与文件描述符
文件表是内核中的概念,但却是我们理解文件描述符所必备的概念,我们通过下面这副图来再次理解下文件描述符。
进程表项中有文件描述符表,文件描述符里面又有文件描述符标志位和文件指针,文件指针用来指向文件描述符表的,文件描述符标志位标志着是哪一位。
注意:在Linux下没有将相关的数据结构分为i结点和v结点,它是直接采用了一个与文件系统相关的i结点和一个与文件系统无关的i结点。
一个进程里面的文件描述符不但可以指向不同的文件表,同时两个不同的进程还可以指向相同的文件表项。
下图是两个进程指向同一个v结点的图示:
1.3总结
由于进程拥有文件描述符表,所以在不同的进程中可以出现相同的文件描述符,它们可以指向不同的文件,也可以指向相同的文件。 两个不同的文件描述符,若指向同一个打开文件句柄,将共享同一文件偏移量。因此,如果通过其中一个文件描述符来修改文件偏移量(由调用read()、write()或lseek()所致),那么从另一个描述符中也会观察到变化,无论这两个文件描述符是否属于不同进程,还是同一个进程,情况都是如此。 要获取和修改打开的文件标志(例如:O_APPEND、O_NONBLOCK和O_ASYNC),可执行fcntl()的F_GETFL和F_SETFL操作,其对作用域的约束与上一条颇为类似。 文件描述符标志(即,close-on-exec)为进程和文件描述符所私有。对这一标志的修改将不会影响同一进程或不同进程中的其他文件描述符
二、dup()和dup2()函数
2.1函数简介
dup()和dup2()函数是用来复制一个文件描述符,可以实现文件共享。由于返回新的文件描述符与原来的文件描述符对应同一个文件表,所以它们共享同一个当前文件的偏移量,因此在利用新的文件描述符向文件中写入数据的时候不会出现数据覆盖的问题。所以它们经常被用来重定向到进程的标准输入、标准输出、标准出错。
2.1函数原型
在Linux下这两个函数的原型如下
#include int dup(int oldfd);
int dup2(int oldfd, int newfd);
返回值:
调用成功返回新的文件描述符 调用失败返回-1
函数参数:
oldfd:被复制的文件描述符 newfd:在dup2中指定新的文件描述符
2.2dup函数与dup2函数区别
在dup函数中返回的是进程中未使用的数值最小的文件描述符,这个和open函数是一样的,而dup2函数会先关闭指定的文件描述符,然后返回该文件描述符作为新的文件描述符。
dup2函数相当于先执行了close函数,再执行了fcntl函数进行文件描述符的复制,这个操作是一个原子操作
dup2函数第二个参数取值返回[0-255]
http://www.dengb.com/Linuxjc/1246966.htmlwww.dengb.comtruehttp://www.dengb.com/Linuxjc/1246966.htmlTechArticleLinux:dup和dup2文件描述符及函数解析,dupdup2 一、文件描述符 1.1 文件描述符概念 我们知道在Linux下一切皆文件,因此我们需要一个东西对这...
linux dup用法,Linux:dup和dup2文件描述符及函数解析,dupdup2相关推荐
- Linux:dup/dup2 文件描述符重定向函数(有图有代码有真相!!!)
一.dup/dup2 有时我们希望把标准输入重定向到一个文件,或者把标准输出重定向到一个网络连接.系统调用dup和dup2能够复制文件描述符.dup返回新的文件文件描述符(没有用的文件描述符最小的编号 ...
- 嵌入式Linux系统编程学习之九基于文件描述符的文件操作
文章目录 前言 一.文件描述符 二.打开.创建和关闭文件 三.读写文件 四.改变文件大小 五.文件定位 六.原子操作 七.进一步理解文件描述符 八.文件描述符的复制 九.文件的锁定 十.获取文件信息 ...
- Linux 下的0 1 2特殊文件描述符~
最近在做项目的时候遇到的几个知识点,我觉得非常有意思,以前学Linux的时候也有接触到管道方面的,但是在应用中却基本没有遇到过. 还有Linux下的几个特殊的文件描述符,用这几个文件描述符可以做很多事 ...
- Linux中的进程、线程和文件描述符
说到进程,恐怕面试中最常见的问题就是线程和进程的关系了,那么先说一下答案: 在 Linux 系统中,进程和线程几乎没有区别 . Linux 中的进程就是一个数据结构,看明白就可以理解文件描述符.重定向 ...
- Linux操作系统~系统文件IO,什么是文件描述符fd?什么是vfs虚拟文件系统
目录 1.open() (1).第二个参数flags-通过比特位传多组标记 2.文件描述符fd(open函数的返回值) (1).fd的本质 (2).vfs-虚拟文件系统(一切皆文件) (3).调用re ...
- 文件描述符、函数open和openat
文件描述符 pcb:结构体 一个进程有一个文件描述符:1024 文件描述符:寻找磁盘文件 函数open和openat 函数原型: include<sys/stst.h> #include& ...
- ftpclient读取服务器文件能获得文件名文件大小0_理解Linux的文件描述符FD与Inode
FD 文件描述符 一.概念 Linux 系统中,把一切都看做是文件,当进程打开现有文件或创建新文件时,内核向进程返回一个文件描述符,文件描述符就是内核为了高效管理已被打开的文件所创建的索引,用来指向被 ...
- STDOUT_FILENO文件描述符的重定向及还原 (dup2函数用法) Linux系统编程
在重定向之前保存默认文件描述符,在向text文件写入后再还原STDOUT_FILENO描述符 #include<stdio.h> #include<stdlib.h> #inc ...
- Linux学习笔记6 文件操作——文件描述符
基于文件描述符的文件操作 进程一启动,内核就打开了三个描述符,0(标准输入 STDIN),1(标准输出STDOUT), 2(标准错误输出STDERR).Linux用整形数做文件操作,因此称为文件描述符 ...
最新文章
- JDBC第一篇之获得数据库连接
- XenDesktop5 SP1发布在即
- 转:Linux--进程间通信(信号量,共享内存)
- LeetCode 558. 四叉树交集(递归)
- utf-8是否带签名 乱码问题。
- Linux防CC攻击脚本
- teablue数据分析_基于大数据分析的茶叶质量评估
- 谈谈Web Workers
- java hibernate的使用_java – 使用hibernate / JPA登录
- 11.string容器
- hmcl整合包导入_我只用了一篇文章就完成了Spring+SpringMVC+MyBatis详细整合教程
- Sublime Text实现代码自动生成,快速编写HTML/CSS代码
- 数据库优化——慢查询MySQL定位优化流程
- happyCode(11start) 权限控制 shiro 密码MD5安全加密,密码盐,系统用户认证
- matplotlib 入门之Sample plots in Matplotlib
- python学习笔记14 图像格式转换png转jpg
- 金三银四的背后--软件测试工程师的求职之路
- 「万字总结」熬夜总结50个JS的高级知识点,全都会你就是神
- 针对知识图谱嵌入(KGE)的投毒攻击【论文阅读】
- 关于WirelessKey的一些说明