700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 文件描述符的复制(dup)

文件描述符的复制(dup)

时间:2020-06-04 08:38:06

相关推荐

文件描述符的复制(dup)

1.dup和dup2函数的介绍

int dup(int oldfd);返回一个文件描述符,参数是要复制的那个文件描述符。

2.使用dup进行文件描述符的复制

(1)dup系统调用对fd进行复制,会返回一个新的文件描述符,(譬如原来的是3,返回的是4(返回一个最小的空的文件描述符))

(2)dup不能指定返回的文件描述符而是按系统分配原则返回fd,就是返回一个最小的空的文件描述符。

(3)dup返回的fd和原来的oldfd都指向原来oldfd打开的那个动态文件,实现了文件共享。

(4)dup返回的fd和原来的oldfd同时向一个文件是,结果是接续写。

#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#define FILENAME "1.txt"int main(void){int fd1 = -1;int fd2 = -1;char writeBuf[] = "asdjklajdqwe";fd1 = open(FILENAME,O_RDWR | O_CREAT | O_TRUNC,0644);if(fd1 < 0){perror("open");return -1;}printf("fd1 = %d\n",fd1);fd2 = dup(fd1);printf("fd2 = %d\n",fd2);write(fd1,writeBuf,10);write(fd2,writeBuf,10);close(fd1);return 0;}

3.使用dup的缺陷

(1)dup不能指定返回新的文件描述符的数字,dup2修复了这个缺陷,所以根据实际情况来决定使用dup和dup2.

4.练习(用dup复制的文件描述符做标准输出)

(1)之前课程讲过0、1、2这三个fd被标准输入、输出、错误通道占用。而且我们可以关闭这三个

(2)我们可以close(1)关闭标准输出,关闭后我们printf输出到标准输出的内容就看不到了

(3)然后我们可以使用dup重新分配得到1这个fd,这时候就把oldfd打开的这个文件和我们1这个标准输出通道给绑定起来了。这就叫标准输出的重定位。

(4)可以看出,我们可以使用close和dup配合进行文件的重定位。

#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#define FILENAME "1.txt"int main(void){int fd1 = -1;int fd2 = -1;char writeBuf[] = "asdjklajdqwe";fd1 = open(FILENAME,O_RDWR | O_CREAT | O_TRUNC,0644);if(fd1 < 0){perror("open");return -1;}printf("fd1 = %d\n",fd1);close(1); //1就是标准输出stdoutfd2 = dup(fd1); //fd2一定等于1,因为前面刚刚关闭了1,//这句话就把1.txt文件和标准输出就绑定起来了,//所以以后输出到标准输出的信息就可以到1.txt中查看printf("fd2 = %d\n",fd2);close(fd1);return 0;}

1.txt里的内容是fd2 = 1;

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。