首页服务器Linux服务器 Linux中文件描述符fd与文件指针FILE*互相转换实例解析

Linux中文件描述符fd与文件指针FILE*互相转换实例解析

本文研究的主要是Linux中linux/202671.html">linux/202188.html">linux/139146.html">linux/241917.html">文件描述符fd与文件指针FILE*互相转换的相关内容,具体介绍如下。 …

本文研究的主要是Linux中linux/202671.html">linux/202188.html">linux/139146.html">linux/241917.html">文件描述符fd与文件指针FILE*互相转换的相关内容,具体介绍如下。

1.文件描述符fd的定义:文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。

2.文件指针FILE定义说明文件指针的一般形式为:

FILE *指针变量标识符;

其中FILE应为大写,它实际上是由系统定义的一个结构,该结构中含有文件名、文件状态和文件当前位置等信息。在编写源程序时不必关心FILE结构的细节。

使用系统调用的时候用文件描述符的时候比较多,但是操作比较原始。C库函数在I/O上提供了一些方便的包装(比如格式化I/O、重定向),但是对细节的控制不够。

如果过度依赖其中的一种只会徒增麻烦,所以知道两者的转换是很有必要的。FILE*是对fd的封装

当然,有人会说知道文件路径的话重新打开就是了,但是这会产生竞争条件(Race Conditions),首先重新打开文件,相当于是2个fd指向同一文件,然后如果在打开的期间文件被删除了又被新建了一个同名文件,2个fd指向的便是不同的文件。

glibc库提供了两个转换函数fdopen(3)和fileno(3),都是中的

FILE *fdopen(int fd, const char *mode);
int fileno(FILE *stream);

PS:为了节省篇幅,还是继续忽略返回值的检查。

来看看测试吧,是不是我们想的那样。

#include #include #include int main(){  const char* filename = "new.txt";  int fd = open(filename, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);  FILE* fp = fdopen(fd, "w+");  int fd2 = fileno(fp);  printf("fd=%d | fd2=%d/n", fd, fd2);  fclose(fp);  close(fd);  return 0;}
本文来自网络,不代表1号站长-站长学院|资讯交流平台立场。转载请注明出处: https://www.1cn.cc/fwq/Linux/9319.html
上一篇2018值得选用的五个Linux服务器发行版
下一篇 虚拟机Linux桥接模式下设置静态IP详解
admin

作者: admin

这里可以再内容模板定义一些文字和说明,也可以调用对应作者的简介!或者做一些网站的描述之类的文字或者HTML!

为您推荐

评论列表()

    联系我们

    联系我们

    0898-88888888

    在线咨询: QQ交谈

    邮箱: email@wangzhan.com

    工作时间:周一至周五,9:00-17:30,节假日休息

    关注微信
    微信扫一扫关注我们

    微信扫一扫关注我们

    关注微博
    返回顶部