閱讀320 返回首頁    go 小米 go 小米6


Linux文件共享(三)——dup

dup返回的新文件描述符是當前可用文件描述符中的最小值。它返回的新描述符與參數fd共享一個文件表項(file對象)。調用dup會使file的引用計數增1,即增加“打開文件”引用計數。圖3-3apue中的原圖。

 

我們用以下程序測試並說明:

#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,文件並沒有真正關閉,因為dupfile的引用計數為2close(fd1),隻是使引用計數變為1,而file對象並沒有銷毀。我們可以用圖形表示調用dup後的情況。


總結:dup會增加“打開文件引用計數”(file對象的引用計數),造成兩個描述符指向同一file對象。但不會創建新的file對象。

最後更新:2017-04-03 12:56:03

  上一篇:go NYOJ282-You are my brother
  下一篇:go C# 係統應用之通過注冊表獲取USB使用記錄(一)