Linux文件共享(三)——dup
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對象。
最後更新:2017-04-03 12:56:03