LINUX C语言 文件指针/句柄(FILE*)、文件描述符(FD)以及 文件路径(FILEPATH)的相互转换
Posted on 2013-09-26 12:03 香蕉菊花小哥 阅读(5671) 评论(0) 编辑 收藏
转自: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