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;