I/O关于文件描述符和文件流指针

I/O关于文件描述符和文件流指针

标准库IO接口

      fopen fwrite fread fseek fclose

系统调用IO接口

      open write read lseek close

      open –flag: O_RDONLY O_WRONLY O_RDWR O_CREAT O_APPENO

文件描述符

进程通过struct file 结构体来描述打开的文件—使用了struct file* fd——array[]。文件描述符就是这个数组的下标。

       用户打开文件,操作系统通过file结构体描述文件,并且将指针添加进入fd_array中,向用户返回这个文件描述信息在数组中         位置(下标),用户操作文件的时候将这个文件下标传递给操作系统,操作系统将通过下标找到文件描述信息进而操作文              件。

 

文件描述符

在Linux系统中打开文件就会获得文件描述符,它是个很小的正整数。每个进程在PCB(Process Control Block)             中 保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针,已打开的文件               在 内核中用file结构体表示,文件描述符表中的指针指向file结构体。

 

      进程的文件描述符是有上限的。

      文件描述符的分配规则:最小未使用原则

      默认从3开始—因为一个进程运行起来之后,默认会打开三个文件:

 

文件流指针和文件描述符有什么关系:

      库函数的操作句柄是文件流指针

      系统调用接口的句柄是文件描述符

FILE*)文件指针:

文件指针指向进程用户区中一个被叫做FILE结构的结构数据。FILE结构包括一个缓冲区和一个文件描述符 。而文件描述符是文件描述符表的一个索引,因此从某种意义上说文件指针就是句柄的句柄(在Windows系统上,文件描述符被称作文件句柄)。

通常,任何程序运行起来之后都会默认的打开三个标准输入流(stdin:键盘),标准输出流(stdout:显示器),标准错误流(stderr:显示器)。

文件描述符与文件指针的区别

简单归纳:fd只是一个整数,在open时产生,起到一个索引的作用,进程通过PCB中的文件描述符表找到该fd所指向的文件指针file。

open:文件描述符的操作(如:open)返回的是一个文件描述符(int fd),内核会在每个进程空间中维护一个文件描述符表,所有打开的文件都将通过,此表中的文件描述符来引用。

fopen:流(如:fopen)返回的是一个文件指针(即指向FILE结构体的指针),FILE结构是包含有文件描述符的,fopen可以看做是open(fd直接操作的系统调用)的封装,它的优点是带有I/O缓存。

 

C语言的文件指针与文件描述符的相互转换可通过fdopen和fileno两个函数实现。它们都包含在头文件stdio.h中。

fdopen的原型:

FILE *fdopen(int filedes,const char *opentype);

第一个参数filedes是一个打开的文件描述符,opentype是表示打开方式的字符串,和fopen函数具有相同的取值,比如”w”或”w+”等。但是你必须保证该字符串的描述和文件实际的打开方式是匹配的。函数fopen()就是返回打开文件的指针;如果操作失败,返回空指针null。

 

把文件流指针转换成文件描述符用fileno函数,

其原型为:

int fileno(FILE *stream);

它返回的是和stream文件流对应的文件描述符。如果失败,返回-1;

当程序执行时,就已经有三个标准文件流打开了,它们分别是(标准输入)stdin,(标准输出)stdout,(标准错误输出)stderr,和流式文件相对应的是,也有三个文件描述符被预先占用(它们分别是:

0((标准输入)stdin),1((标准输出)stdout),2((标准错误输)stderr));

 

内核态和用户态的转化问题

用户态切换到内核态需要使用系统调用:如发起系统调用-write read

重定向:

改变数据流向,将写入指定文件的数据,改变之后写入到了另一个文件。

      重定向指的是描述符的重定向----因为描述符并没有改变,改变的是描述符所对应的文件信息。

 

————————————————————————————————

参考文章:

      mm_hh:https://blog.csdn.net/mm_hh/article/details/71374474

      琴酒网络:https://www.cnblogs.com/ginvip/p/6350222.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值