我们一般通过dup()和dup2()函数来复制文件描述符,现在介绍另外一种方法:
linux系统下提供了名为/dev/fd的目录,其下有0、1、2等文件,打开文件/dev/fd/n等效于复制描述符n。
先观察一下/dev/fd这个目录:
可以看到包含了标准输入(0),标准输出(1),标准错误(2)及当前可用文件描述符中的最小值(3)。
以下代码测试了用打开/dev/fd/n来复制文件描述符n的功能:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
int main()
{
int fd, fd2;
char path_name[64];
char string[] = "This is a test for fd copy\n";
/* 打开文件, 显示文件描述符的值 */
fd = open("testfile", O_RDWR);
if(fd == -1) {
printf("can not open test file\n");
exit(1);
}
printf("fd = %d\n", fd);
/* 打开/dev/fd/n,复制该文件描述符 */
sprintf(path_name, "/dev/fd/%d", fd);
fd2 = open(path_name, O_RDWR);
if(fd2 == -1) {
printf("can not open /dev/fd/%d\n", fd);
exit(1);
}
printf("fd2 = %d\n", fd2);
/* 使用复制的文件描述符向文件写数据 */
write(fd2, string, sizeof(string));
close(fd);close(fd2);
exit(0);
}
编译后执行,结果如图:
先创建一个空文件testfile, 用cat指令观察,该文件没有任何内容,然后执行测试程序,测试程序先打开testfile,得到fd为3,然后再打开文件/dev/fd/3,复制该文件描述符,得到fd2=4,最后通过复制的fd2向testfile写入一串数据,程序结束。再用cat指令观察testfile,数据已经被写入该文件,说明复制文件描述符操作成功。