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结构体。
    I/O关于文件描述符和文件流指针_第1张图片
    I/O关于文件描述符和文件流指针_第2张图片

    进程的文件描述符是有上限的。
    文件描述符的分配规则:最小未使用原则

    默认从3开始—因为一个进程运行起来之后,默认会打开三个文件:
    I/O关于文件描述符和文件流指针_第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

你可能感兴趣的:(内存,c,Linux)