dup和dup2
来源:互联网 发布:流星网络电视 apk 编辑:程序博客网 时间:2024/06/05 05:57
dup和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
函数的用法,请结合后面的连环画理解程序的执行过程。
dup和dup2示例程序
#include <unistd.h>#include <sys/stat.h>#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <string.h>int main(void){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;}
dup/dup2示例程序
重点解释两个地方:
第3幅图,要执行
dup2(fd, 1);
,文件描述符1原本指向tty
,现在要指向新的文件somefile
,就把原来的关闭了,但是tty
这个文件原本有两个引用计数,还有文件描述符save_fd
也指向它,所以只是将引用计数减1,并不真的关闭文件。第5幅图,要执行
dup2(save_fd, 1);
,文件描述符1原本指向somefile
,现在要指向新的文件tty
,就把原来的关闭了,somefile
原本只有一个引用计数,所以这次减到0,是真的关闭了。
#include<unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);
dup() uses the lowest-numbered unused descriptor for the new descriptor.
dup2() makes newfd be the copy of oldfd, closing newfd first ifnecessary, but note the following:
*If oldfd is not a valid file descriptor, then the call fails, and newfd is not closed.
*If oldfd is a valid file descriptor, and newfd has the same value as oldfd, then dup2() does nothing, and returns newfd.
1)这两个函数我们可以用来复制文件描述符。
2)其中oldfd和newfd分别是复制前文件描述符和复制后的文件描述符。
3)这两个函数的调用都将复制文件描述符oldfd,且他们的返回值都为新的文件描述符。
4)不同点是:dup()的返回值是最小的未用文件描述符;dup2()的返回值是预先制定的文件描述符newfd。
5)对于dup2(),如果文件描述符newfd正在被使用,则先关闭newfd;如果newfd同oldfd,则不关闭该文件正常返回。
PS:这是我自己对书上的话进行的分类。
2.首先要弄懂的话,还要对文件描述符了解的清晰:
关系:进程---(拥有)--->(若干个)文件描述符()---(对应)--->文件
|--->文件秒素符(0)
|--->文件描述符(1)--->文件(1)
某进程(n)--|--->文件描述符(2)
|--->文件描述符(3)--->文件(3)
|.
|.
|.
|--->文件描述符(1023)--->文件(...)
PS1:由一次open()函数打开的文件是可以有很多个描述符与之相连的;
PS2:Linux中每个进程可以有1024个文件描述符;
PS3:文件描述符前三位0、1、2分别对应:
STDIN_FILENO 0 标准输入文件
STDOUT_FILENO 1 标准输出文件
STDERR_FILENO 2 标准错误输出文件
因此就可以较好的开始理解dup(int oldfd)和dup2(int oldfd, int newfd)函数是如何工作的:
dup()比较好了解:
系统分配一个新的、未用过的、值为最小的文件描述符指向dup()函数内的参数oldfd所指向的文件,并返回该值。
dup2()比较难理解:
1)dup2()先看看oldfd是不是一个有效的文件描述符,如果不是则调用失败,newfd文件描述符也不关闭;
2)如果oldfd是一个有效的文件描述符,则检测newfd是否被使用,如在使用,则将其关闭,并将newfd指向oldfd所指向的文件,并返回newfd;
3)如果newfd同oldfd,则不关闭该文件正常返回。
0 0
- 理解dup和dup2
- 理解dup和dup2
- 理解dup和dup2
- 理解dup和dup2
- dup2和dup
- dup和dup2函数
- 理解dup和dup2
- dup和dup2函数
- 理解dup和dup2
- dup()和dup2()解惑
- dup()和dup2()函数
- 理解dup和dup2
- dup和dup2函数
- dup和dup2
- dup和dup2
- dup和dup2
- apue dup和dup2
- dup()和dup2()函数
- SQL Server复制入门(二)----复制的几种模式
- 微信开发 "errcode":-1 应该怎么办
- Cocos2d-x使用瓦片地图
- 黑马程序员---Java高新技术(3)
- 关于private继承的几点理解
- dup和dup2
- IOS开发之——改进iOS客户端的升级提醒功能
- memset详解 设置无穷大INF
- 搭配购买(01背包+并查集)
- ZOJ Problem Set - 1240 IBM Minus One
- SQL Server中的高可用性(3)----复制
- 记账理财,就选我爱管账
- python 列表 字典 string 互相转换
- Android剖析和运行机制