• 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
    ");
    24             exit(1);
    25         }
    26         filename[r] = '';
    27         printf("fp -> fno -> filename: %p -> %d -> %s
    ",
    28                 fp, fno, filename);
    29     }
    30     return 0;
    31 }

    输出结果:

    fp -> fno -> filename: 0x80010294 -> 3 -> /tmp/test.txt
  • 相关阅读:
    启动WCF多个服务方法
    获取本机内存使用信息、DataTable占用内存空间
    分享到微博代码
    EXCEL拼接SQL
    动态调用webservice及WCF服务
    整洁架构
    端口与适配器架构
    清晰架构
    EBI架构 VS. MVC
    查看Oracle加锁情况及解锁方法
  • 原文地址:https://www.cnblogs.com/mushui/p/3340546.html
Copyright © 2020-2023  润新知