LINUX C语言 文件指针/句柄(FILE*)、文件描述符(FD)以及 文件路径(FILEPATH)的相互转换

48 篇文章 14 订阅

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
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值