Linux 文件描述符fd(file descriptor)

Linux 文件描述符fd(file descriptor)

百科解释: 内核(kernel)(操作系统最基本的部分)利用文件描述符(file descriptor)来访问文件。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。
作用: 内核利用文件描述符来访问文件

前提假设:

  1. 每一个文件描述符会与一个打开文件相对应;
  2. 不同的文件描述符可以指向同一个文件;
  3. 相同的文件可以被不同的进程打开也可以在同一个进程中被多次打开;
  4. 同一进程,同一文件描述符不可能同时对应多个文件;
  5. 不同进程,相同文件描述符,可能对应相同的文件,也可能不同;

最大打开文件数(每个进程文件描述符极限)

Linux的OPEN_MAX缺省值 1024(0~1023);
可以通过 ulimit指令进行修改,修改的数值要符合一定规定;
查看指令 ulimit -a 查看open files的对应值;
修改指令 ulimit -n 大小值 进行修改,也可以修改系统配置文件(不建议);
Linux 文件描述符fd(file descriptor)_第1张图片
cat /proc/sys/fs/file-max查看该电脑最大打开文件的个数,受内存影响;在这里插入图片描述

前三个文件描述符(0、1、2),默认被占用

文件描述符描述的文件,这三个描述的是设备文件(终端);

  1. 习惯上,标准输入(standard input)的文件描述符是 0,系统获取输入,会去读标准输入;
  2. 标准输出(standard output)是 1,屏幕等设备的内容来自标准输出还有错误;
  3. 标准错误(standard error)是 2;
    POSIX 定义了 STDIN_FILENO、STDOUT_FILENO 和 STDERR_FILENO 来代替 0、1、2,这三个符号常量的定义位于头文件 unistd.h

常见问题

Q1:文件描述符和文件指针的区别?

文件描述符(fd): 在linux系统中打开文件就会获得文件描述符,它是个很小的非负整数。每个进程在PCB(Process Control Block)中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针。
文件指针(FILE*): C语言中使用文件指针做为I/O的句柄(即在这里文件指针起到的就是文件描述符的作用)。文件指针指向进程用户区中的一个被称为FILE结构的数据结构。FILE结构包括一个缓冲区和一个文件描述符。而文件描述符是文件描述符表的一个索引,因此从某种意义上说文件指针就是句柄的句柄(在Windows系统上,文件描述符被称作文件句柄)。

2020/07/23 11:35
@luxurylu

你可能感兴趣的:(Linux系统编程,linux,内核)