原文url: http://learn.akae.cn/media/ch29s03.html
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
函数的用法,请结合后面的连环画理解程序的执行过程。
例 29.2. 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;
}
重点解释两个地方:
-
第3幅图,要执行dup2(fd, 1);
,文件描述符1原本指向tty
,现在要指向新的文件somefile
,就把原来的关闭了,但是tty
这个文件原本有两个引用计数,还有文件描述符save_fd
也指向它,所以只是将引用计数减1,并不真的关闭文件。
-
第5幅图,要执行dup2(save_fd, 1);
,文件描述符1原本指向somefile
,现在要指向新的文件tty
,就把原来的关闭了,somefile
原本只有一个引用计数,所以这次减到0,是真的关闭了。
分享到:
相关推荐
详细介绍dup2函数用法,一看必懂.。。。
C语言dup()函数:复制文件描述词 头文件: #include 定义函数: int dup (int oldfd); 函数说明:dup()用来复制参数oldfd 所指的文件描述词, 并将它返回. 此新的文件描述词和参数oldfd 指的是同一个文件, 共享...
dup函数在系统编写程序的用法 及源代码
main函数内 UnitTest_autoRunDemo自动运行 UnitTest_voShowVi(0,0,0,0);决定显示红外还是可见光 Disp_drvStart 使能通道 发送信号 alloc窗口的个数 每个窗口的属性 Disp_drvSetDisp 绑定显示输入源 打印绑定关系 ...
dup系统调用的服务例程为sys_dup函数,定义在fs/fcntl.c中。sys_dup()的代码也许称得上是简单的之一了,但是是这么一个简单的系统调用,却成了linux系统的一个特性:输入/输出重定向。sys_dup()的主要工作是用来...
编写名为strdup的函数,此函数使用动态存储分配来产生字符串的副本。例如调用 • p= strdup(str); • 将为和str相同的字符串分配空间,并且把字符串str的内容 复制给新字符串,然后返回指向新字符串的指针,如果...
1.1 数组和字符串 2 1.1.1 一维数组的倒置 2 范例1-1 一维数组的倒置 2 ∷相关函数:fun函数 1.1.2 一维数组应用 3 范例1-2 一维数组应用 3 1.1.3 一维数组的高级应用 5 范例1-3 一维数组的高级应用 5 1.1.4...
1.1 数组和字符串 2 1.1.1 一维数组的倒置 2 范例1-1 一维数组的倒置 2 ∷相关函数:fun函数 1.1.2 一维数组应用 3 范例1-2 一维数组应用 3 1.1.3 一维数组的高级应用 5 范例1-3 一维数组的高级应用 5 1.1.4...
∷相关函数:InOrderTraverse2函数 1.4.12 后序遍历二叉树(顺序结构) 180 范例1-66 后序遍历二叉树 180 ∷相关函数:PostOrderTraverse函数 1.4.13 后序遍历二叉树(链式结构) 183 范例1-67 后序遍历二叉树 ...
3.12 dup和dup2函数 3.13 fcntl函数 3.14 ioctl函数 3.15 /dev/fd 3.16 小结 习题 第4章 文件和目录 4.1 引言 4.2 stat,fstat和lstat函数 4.3 文件类型 4.4 设置-用户-ID和设置-组-ID 4.5 文件存取许可权 4.6 新...
3.12 dup和dup2函数 3.13 fcntl函数 3.14 ioctl函数 3.15 /dev/fd 3.16 小结 习题 第4章 文件和目录 4.1 引言 4.2 stat,fstat和lstat函数 4.3 文件类型 4.4 设置-用户-ID和设置-组-ID 4.5 文件存取许可权 4.6 新...
3.12 dup和dup2函数60 3.13 sync、fsync和fdatasync函数61 3.14 fcntl函数62 3.15 ioctl函数66 3.16 /dev/fd 67 3.17 小结68 习题68 第4章文件和目录71 4.1 引言71 4.2 stat、fstat和lstat函数71 目录 ...
3.12 dup和dup2函数 3.13 sync、fsync和fdatasync函数 3.14 fcntl函数 3.15 ioctl函数 3.16 /dev/fd 3.17 小结 习题 第4章 文件和目录 4.1 引言 4.2 stat、fstat和lstat函数 4.3 ...
3.12 dup和dup2函数 46 3.13 fcntl函数 47 3.14 ioctl函数 50 3.15 /dev/fd 51 3.16 小结 52 习题 52 第4章 文件和目录 54 4.1 引言 54 4.2 stat, fstat和lstat函数 54 4.3 文件类型 55 4.4 设置-用户-ID和设置-组-...
NS-2版本TCP源码分析 NS-2下的TCP和TCP Reno模块分析 ...相对TCP Tahoe,重载了window()、windowd()、recv()、dupack_action()、timeout()几个函数,增加了allow_fast_retransmit()函数。下面是具体的分析:
3.12 dup和dup2函数 46 3.13 fcntl函数 47 3.14 ioctl函数 50 3.15 /dev/fd 51 3.16 小结 52 习题 52 第4章 文件和目录 54 4.1 引言 54 4.2 stat, fstat和lstat函数 54 4.3 文件类型 55 4.4 设置-用户-ID和设置-组-...
3.12 dup和dup2函数 46 3.13 fcntl函数 47 3.14 ioctl函数 50 3.15 /dev/fd 51 3.16 小结 52 习题 52 第4章 文件和目录 54 4.1 引言 54 4.2 stat, fstat和lstat函数 54 4.3 文件类型 55 4.4 设置-用户-ID和设置-组-...