Linux C語言 文件指針/句柄(FILE*)、文件描述符(fd)以及 文件路徑(filepath)的相互轉換


轉自:http://blog.csdn.net/jenghau/article/details/5532265

http://stackoverflow.com/questions/11221186/how-do-i-find-a-filename-given-a-file-pointer

十分感謝原文作者!

 

文件指針/句柄(FILE*)、文件描述符(fd)以及 文件路徑(filepath)的相互轉換

 

最近在linux下編程常需要對一些文件進行操作。有時不同的條件下,需要將文件指針/句柄(FILE*)、文件描述符(fd)以及文件路徑(filepath)進行相互轉換,以滿足實際的編程需要。

現簡單的做一下整理。如下。

 

 

1:文件路徑 文件描述符應是唯一的。文件指針(值)不是唯一的,但指向的對象也應該是唯一的。
2: FILE*中包含fd的信息,而且還包含IO緩沖,所以可以理解為FILE*是對fd的封裝,是C的標准形式,所以FILE*比fd更適合跨平台,應多用fopen,少用 open。

 

3:轉換

   文件路徑 到 文件指針:filepath --fopen()-->FILE*;
   文件路徑 到 文件描述符:filepath--open()--fd;

 

   文件描述符 到 文件指針:fd--fdopen()-->FILE*;
   文件描述符 到 文件路徑:fd--readlink(/proc/%getpid()/fd/%fd"))-->filepath; //這屬於“曲線救國”

   文件指針 到 文件描述符:FILE*--fileno()--->fd;
   文件指針 到 文件路徑:FILE* --- ??? ---PATH;// 這個的直接轉換的方法還沒有查到。請補充。

 

 1 #include <stdio.h>
 2 #include <unistd.h>
 3 #include <stdlib.h>
 4 
 5 int main()
 6 {
 7     int MAXSIZE = 0xFFF;
 8     char proclnk[0xFFF];
 9     char filename[0xFFF];
10     FILE *fp;
11     int fno;
12     ssize_t r;
13 
14     // test.txt created earlier
15     fp = fopen("test.txt", "r");
16     if (fp != NULL)
17     {
18         fno = fileno(fp);
19         sprintf(proclnk, "/proc/self/fd/%d", fno);
20         r = readlink(proclnk, filename, MAXSIZE);
21         if (r < 0)
22         {
23             printf("failed to readlink\n");
24             exit(1);
25         }
26         filename[r] = '\0';
27         printf("fp -> fno -> filename: %p -> %d -> %s\n",
28                 fp, fno, filename);
29     }
30     return 0;
31 }

輸出結果:

fp -> fno -> filename: 0x80010294 -> 3 -> /tmp/test.txt

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM