复制文件描述符可以用Linux系统提供的两个系统调用 dup(), dup2(),复制后,新的描述符也标识旧描述符所标识的文件。这样的话,原来的文件描述符和新的文件描述符都指向同一个文件,我们操作这两个文件描述符的任何一个,都能操作它所对应的文件。就像配钥匙一样,新钥匙和旧钥匙都能打开原来的那把锁。(这个类比是从网上看到的,感觉相当形象。)
dup()
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main()
{
int file1, file2;
file1 = open("./main.new",O_WRONLY|O_CREAT,0666);
if(file1 < 0)
{
perror("open file");
return -1;
}
printf("旧 的文件描述符 %d\n",file1);
file2 = dup(file1);
printf("新 的文件描述符 %d\n",file2);
const char* buf1 = "我是 旧 描述符写进来的。\n";
write(file1,buf1,strlen(buf1));
const char* buf2 = "我是 新 描述符写进来的。\n";
write(file2,buf2,strlen(buf2));
close(file1);
close(file2);
return 0;
}
[lingyun@manjaro study]$ gcc study.c
[lingyun@manjaro study]$ ./a.out
旧 的文件描述符 3
新 的文件描述符 12
[lingyun@manjaro study]$ cat main.new
我是 旧 描述符写进来的。
我是 新 描述符写进来的。
dup2()
dup2() 和 dup() 的功能差不多,但是 dup2() 可以指定任意一个合法的数字作为新的文件描述符。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main()
{
int file1, file2;
file1 = open("./main.new",O_WRONLY|O_CREAT,0666);
if(file1 < 0)
{
perror("open file");
return -1;
}
printf("旧 的文件描述符 %d\n",file1);
/*直接指定 1 为新的文件描述符,此时标准输出描述符就指向了文件 main.new,
* 所以当执行 printf() 函数时,其内容会被打印到文件 main.new 中。
* 相当于执行了
* close(1);
* file2 = dup(file1);
* 这两条语句 */
file2 = dup2(file1,1);
printf("新 的文件描述符 %d\n",file2);
const char* buf1 = "我是 旧 描述符写进来的。\n";
write(file1,buf1,strlen(buf1));
const char* buf2 = "我是 新 描述符写进来的。\n";
write(file2,buf2,strlen(buf2));
close(file1);
close(file2);
return 0;
}
[lingyun@manjaro study]$ gcc study.c
[lingyun@manjaro study]$ ./a.out
旧 的文件描述符 3
[lingyun@manjaro study]$ cat main.new
新 的文件描述符 1
我是 旧 描述符写进来的。
我是 新 描述符写进来的。