Unix系统编程()复制文件描述符
Bourne shell的IO重定向语法2>&1,意在通知shell把标准错误(文件描述符2)重定向到标准输出(文件描述符1)。因此下列命令将把标准输出和标准错误写入result.log文件。(shell按从左至右的顺序处理IO重定向语句)
shell通过复制文件描述符2实现了标准错误的重定向操作,因此文件描述2与文件描述符1指向同一个打开文件的句柄。可以通过调用dup和dup2来实现此功能。
对于这种重定向的操作,仅仅打开一个目标文件两次是远远不够的(第一次在描述符1上打开,第二次在描述符2上打开)。
首先两个文件不能共享文件偏移量指针,因此有可能导致相互覆盖彼此的输出。
再者打开的文件不一定就是磁盘文件。
在如下命令中,标准错误就将和标准输出一起送达同一管道。
$ ./myscript 2>&1 | less
2>1的作用是把标准错误的输出重定向到1,但这个1不是标准输出,而是一个文件,文件名就是1。
2>&1的作用是把标准错误的输出重定向到标准输出1,&指示不要把1当作普通文件,而是fd=1即标准输出来处理。
dup调用复制一个打开的文件描述符oldfd,并返回一个新的描述符,二者都指向同一打开的文件句柄。系统会保证新文件描述符一定是编号值最低的未使用文件描述符。
int dup(int oldfd);
加入发起如下调用:
newfd = dup(1);
在假定在正常的情况下,shell已经代表程序打开了文件描述符0、1和2,且没有其他描述符在用,dup调用会创建文件描述符1的副本,返回的文件描述符编号值为3。
如果希望返回的文件描述符为2,可以这样:
close(2);
newfd = dup(1);
只有当描述符0已经打开的时候,这段代码方可工作。而且这样做也是有问题的,因为这并不是一个原子操作。如果想进一步简化如下的代码,同时希望获得所期望的文件描述符,可以调用dup2。
int dup2(int oldfd, int newfd);
dup2系统调用会为oldfd参数所指定的文件描述符创建副本,其编号由newfd参数指定。如果由newfd参数所指定的编号的文件描述符之前已经打开了,那么dup2会首先将其关闭。
dup2调用会默认忽略newfd关闭期间出现的任何错误。故此,编码时更为安全的做法是:在调用dup2之前,如果newfd已经打开,则应显式调用close将其关闭。(那要是我不知道newfd是否打开了怎么判断呢?)
之前调用dup和close可以简化为:
dup(1, 2);
如果dup2调用成功,则将返回副本的文件描述符编号(即newfd参数指定的值)。
如果oldfd并非有效的文件描述符,那么dup2调用将失败并返回错误EBADF,且不关闭newfd。如果oldfd有效,且与newfd的值相等,那么dup2将什么也不做,不关闭newfd,并将其作为调用结果返回。
fcntl的F_DUPFD操作是复制文件描述符的另一接口,更具有灵活性。
newfd = fcntl(oldfd, F_DUPFD, startfd);
该调用为oldfd创建一个副本,且将使用大于等于startfd的最小未使用值作为描述符编号。该调用还能保证新描述符newfd编号落在特定的区间范围内。总是能将dup和dup2的调用改写为对close和fcntl的调用。
文件描述符的正、副本之间共享打开文件句柄所含的文件偏移量和状态标志。然后新文件描述符有其自己的一套文件描述符标志,且其close-on-exec标志(FD_CLOEXEC)总处于关闭状态。
下面的接口可以直接控制新文件描述符的close-on-exec标志。
dup3系统调用完成的工作与dup2相同,只是新增了一个附加参数flag,这一个可以是修改系统调用行为的位掩码。
int dup3(int oldfd, int newfd, int flags);
目前dup3只支持一个标志O_CLOEXEC。
dup3只在Linux 2.6.27以后才有,是Linux特有的。
Linux从2.6.24开始支持fcntl用于复制文件描述符的附加命令:F_DUPFD_CLOEXEC。
该标志不仅实现了与F_DUPFD相同的功能,还为新文件描述符设置close-on-exec标志。
这一节有好多系统系统调用:dup,dup2,dup3,fcntl
Unix系统编程()复制文件描述符的更多相关文章
- dup等复制文件描述符函数
[root@bogon code]# cat b.c #include<stdio.h> #include<error.h> #include<unistd.h> ...
- 复制文件描述符---dup
函数功能:复制文件描述符 头文件:#include<unistd.h> 函数原型:int dup(int oldfd) 参数说明:oldfd:旧的文件描述符 返回值:成功返回-个新的文件描 ...
- fcntl函数用法——复制文件描述符
文件描述符复制和输出重定向dup() 用最小的文件描述符来复制,从0开始搜素.复制文件描述符后,最小文件描述符指向被复制描述符指向的文件.dup2(int oldfd,int newfd) 强制用ne ...
- UNIX环境编程学习笔记(4)——文件I/O之dup复制文件描述符
lienhua342014-08-23 UNIX 提供了两个函数 dup 和 dup2 用于复制一个现存的文件描述符. #include <unistd.h> int dup(int fi ...
- UNIX系统编程:文件IO(I)
1.标准C库中访问文件用的是文件指针FILE *(stdin,stdout,stderr):对于linux系统编程而言,所有对设备或文件的操作都是通过文件描述符进行的 2.当打开或者创建一个文件的时候 ...
- Linux系统编程--文件描述符的复制dup()和dup2()【转】
本文转载自:http://blog.csdn.net/tennysonsky/article/details/45870459 dup() 和 dup2() 是两个非常有用的系统调用,都是用来复制一个 ...
- linux系统编程之文件与IO(八):文件描述符相关操作-dup,dup2,fcntl
本节目标: 1,文件共享 打开文件内核数据结构 一个进程两次打开同一个文件 两个进程打开同一个文件 2,复制文件描述符(dup.dup2.fcntl) 一,文件共享 1,一个进程打开两个文件内核数据结 ...
- Unix系统编程()深入探究文件IO概述
open调用将引入原子atomicity操作的概念. 将某一系统调用所要完成的各个动作作为不可中断的操作,一次性加以执行. 原子操作是许多系统调用得以正确执行的必要条件. 还介绍一个系统调用fcntl ...
- 《Linux/Unix系统编程手册》读书笔记2
<Linux/Unix系统编程手册>读书笔记 目录 第5章: 主要介绍了文件I/O更深入的一些内容. 原子操作,将一个系统调用所要完成的所有动作作为一个不可中断的操作,一次性执行:这样可以 ...
随机推荐
- TextView文字横向自己主动滚动
效果截图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjI4Nj ...
- [AngularJS] Angular 1.3 new $q constructor
<!DOCTYPE html> <html ng-app="app"> <head lang="en"> <meta ...
- 根据轨迹线构造GPS点的方法
在地理国情普查项目中,元数据中的轨迹线图层由外业GPS点转换构成.理论上,外业GPS轨迹点在采集时间.采集人员等方面应当保持一致.但是,由于管理上.操作上的原因导致有元数据轨迹线而外业GPS轨迹点的现 ...
- gre tunnel搭建
应用场景: 客户端(client)与服务器A在同一个运营商网络,应用部署在服务器B,服务器A .B之间建立tunnel,A设置dnat,client通过访问A的8000端口来访问服务器B,B返回的响应 ...
- 正确用DD测试磁盘读写速度
转自:http://blogread.cn/it/article/6479?f=wb 问: 以下几种方式测试磁盘读写速度有什么区别? dd bs=1M count=128 if=/dev/zero o ...
- JavaScript中字符串的match与replace方法
1.match方法 match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配. match()方法的返回值为:存放匹配结果的数组. 2.replace方法 replace() 方 ...
- LDAP 中 CN,OU,DC 的含意
CN, OU, DC 都是 LDAP 连接服务器的端字符串中的区别名称(DN, Distinguished Name) LDAP连接服务器的连接字串格式为:ldap://servername/DN ...
- 大比速:remoting、WCF(http)、WCF(tcp)、WCF(RESTful)、asp.net core(RESTful) .net core 控制台程序使用依赖注入(Autofac)
大比速:remoting.WCF(http).WCF(tcp).WCF(RESTful).asp.net core(RESTful) 近来在考虑一个服务选型,dotnet提供了众多的远程服务形式.在只 ...
- IOS性能调优系列:使用Zombies动态分析内存中的僵尸对象
硬广:<IOS性能调优系列>第四篇,预计会有二十多篇,持续更新,欢迎关注. 前两篇<IOS性能调优系列:Analyze静态分析>.<IOS性能调优系列:使用Instrum ...
- RFID UHF(EPC)标签使用常识
文章复制来的,原作者原文点击这里 现在做UHF应用的越来越多了,如何根据实际应用设计系统以达到更佳的使用效果,其中对UHF标签相关内容的了解至关重要,很多朋友对标签的了解不多,在此不才,整理了一些资料 ...