dup返回的新文件描述符是当前可用文件描述符中的最小值。它返回的新描述符与参数fd共享一个文件表项(file对象)。调用dup会使file的引用计数增1,即增加“打开文件”引用计数。图3-3是apue中的原图。
我们用以下程序测试并说明:
-
#include <stdio.h>
-
#include <unistd.h>
-
#include <fcntl.h>
-
#include <string.h>
-
#define FILE_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)
-
int main(int argc, char *argv[])
-
{
-
int fd1=0,fd2=0;
-
char buf1[]="hello";
-
char buf2[]="world";
-
fd1=open("./txt",O_RDWR|O_CREAT,FILE_MODE);
-
printf("fd1:%d\n",fd1);
-
fd2=dup(fd1);
-
printf("fd2:%d\n",fd2);
-
if((write(fd1,buf1,strlen(buf1)))!=strlen(buf1))
-
printf("write fd1 error!!!\n");
-
close(fd1);
-
if((write(fd2,buf2,strlen(buf2)))!=strlen(buf2))
-
printf("write fd2 error!!!\n");
-
return 0;
-
}
运行结果如图:
我们发现第一次调用close,文件并没有真正关闭,因为dup是file的引用计数为2,close(fd1),只是使引用计数变为1,而file对象并没有销毁。我们可以用图形表示调用dup后的情况。
总结:dup会增加“打开文件引用计数”(file对象的引用计数),造成两个描述符指向同一file对象。但不会创建新的file对象。
阅读(1959) | 评论(0) | 转发(0) |