理解文件描述符

作者&投稿:师玉 (若有异议请与网页底部的电邮联系)
~ 在Linux操作系统中,可以将一切都看作是文件,包括普通文件,目录文件,字符设备文件(如键盘,鼠标...),块设备文件(如硬盘,光驱...),套接字等等,所有一切均抽象成文件,提供了统一的接口,方便应用程序调用

既然在Linux操作系统中,你将一切都抽象为了文件,那么对于一个打开的文件,我应用程序怎么对应上呢?

文件描述符应运而生

文件描述符:简称fd,当应用程序请求内核打开/新建一个文件时,内核会返回一个文件描述符用于对应这个打开/新建的文件,其fd本质上就是一个非负整数,读写文件也是需要使用这个文件描述符来指定待读写的文件的

操作系统的核心叫内核,是一个独立的软件

操作系统为每一个进程维护了一个文件描述符表,该表的索引值都从从0开始的,所以在不同的进程中可以看到相同的文件描述符,这种情况下相同的文件描述符可能指向同一个文件,也可能指向不同的文件,具体情况需要具体分析,下面用一张简图就可以很容易的明白了

通过上图可以看到,当不同进程中出现相同的文件描述符时,可能实际对应的文件并不是同一个,相反不同进程中不同的文件描述符也可可能对应同一个文件

文件描述符是一个重要的系统资源,理论上系统内存多大就应该可以打开多少个文件描述符,但是实际情况是,内核会有系统级限制,以及用户级限制(不让某一个应用程序进程消耗掉所有的文件资源,可以使用ulimit -n 查看)

进程 + 文件描述符ID确认,因为内核为每个进程都有一份其所属的文件描述符表

应用程序进程拿到的文件描述符ID == 进程文件描述符表的索引,通过索引拿到文件指针,指向系统级文件描述符表的文件偏移量,再通过文件偏移量找到inode指针,最终对应到真实的文件

最后说下套接字,套接字也是文件,当server端监听到有连接时,应用程序会请求内核创建Socket,Socket创建好后会返回一个文件描述符给应用程序,当有数据包过来网卡时,内核会通过数据包的源端口,源ip,目的端口等在内核维护的一个ipcb双向链表中找到对应的Socket,并将数据包赋值到该Socket的缓冲区,应用程序请求读取Socket中的数据时,内核就会将数据拷贝到应用程序的内存空间,从而完成读取Socket数据

这里提一下,操作系统针对不同的传输方式(TCP,UDP)会在内核中各自维护一个Socket双向链表,当数据包到达网卡时,会根据数据包的源端口,源ip,目的端口从对应的链表中找到其对应的Socket,并会将数据拷贝到Socket的缓冲区,等待应用程序读取

最后附上Linux中进程结构图


Linux 下应用程序最大打开文件数的理解和修改
程序经常访问的文件、socket在Linux中都是文件file,系统需要记录每个当前访问file的name、location、access authority等相关信息,这样的一个实体被称为file entry。“open files table”(图中橙色标识)存储这些file entry,以数组的形式线性管理。文件描述符(file descriptor)作为进程到open files table的指针...

linux查看文件详细信息命令linux查看文件详细信息
Linux查看进程打开多少文件描述符命令?linux系统下查看进程打开文件在\/proc下,对应每个进程有一个以进程号命名的目录,该目录下有一个fd目录,该目录下面的每个文件是一个符号连接,其文件名对应该进程占用的一个文件描述符,而连接指向的内容表示文件描述符对应的实际文件,有多少个文件描述符表示该进程...

C语言里的的fopen和open的区别
open和fopen的区别:前者属于低级IO(系统调用),后者是高级IO。前者返回一个整型文件描述符,后者返回一个文件指针。前者无缓冲,后者有缓冲。前者与 read, write close等函数配合使用, 后者与 fread, fwrite,fclose等配合使用。后者是在前者的基础上扩充而来的,在大多数情况下,应用开发使用后者。

如何才能不继承父进程打开的文件描述符
用 vfork创建子进程后,父进程会被阻塞直到子进程调用exec(exec,将一个新的可执行文件载入到地址空间并执行之。)或exit。vfork的好处是在子进程被创建后往往仅仅是为了调用exec执行另一个程序,因为它就不会对父进程的地址空间有任何引用,所以对地址空间的复制是多余的 ,因此通过vfork共享内存可以减少...

PHP fclose说明
PHP fclose() 函数详解:PHP中的fclose()函数主要作用是操作文件指针,它用于关闭一个由file参数所指向的文件。file参数是一个特定的文件描述符,这个描述符是通过先前的fopen()或fsockopen()函数打开的。当调用fclose()函数时,如果文件操作顺利完成,函数会返回一个布尔值,true表示成功,表明文件已被...

lseek函数出现空洞的返回值是什么啊?
使用 lseek 函数可以改变文件的 cfo 。lseek 的以下用法返回当前的偏移量:off_t currpos;currpos = lseek(fd, 0, SEEK_CUR);这个技巧也可用于判断我们是否可以改变某个文件的偏移量。如果参数 fd(文件描述符)指定的是 pipe(管道)、FIFO 或者 socket,lseek 返回 -1 并且置 errno 为 ESPIPE。

fchmod说明
函数fchmod用于修改由参数fildes所指向的文件的权限。fildes是一个已经打开的文件的文件描述符,它是一个用于标识文件的特殊数值。参数mode的含义与chmod函数中的权限设置规则相同。如果你想了解具体的权限模式,请查阅chmod函数的文档。如果权限更改成功,fchmod将返回0表示操作成功;如果失败,返回-1,这时可以...

fd中文是什么意思
文件描述符(File Descriptor)。文件描述符是计算机科学中的一个概念,尤其在Unix和类Unix操作系统中广泛使用。它是一个非负整数,用于在程序中标识打开的文件、管道、套接字等。当一个文件、套接字或其他I\/O资源被打开时,操作系统会为其分配一个唯一的文件描述符。这样,程序就可以通过这个描述符来...

Linux lsof命令详解和使用示例
因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。 1.命令格式: lsof [参数][文件] 2.命令功能: 用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回\/恢复删除的文件。是十分方便的系统监视工具,...

Linux lsof命令详解
lsof的输出包含多个列,如进程名(COMMAND)、进程ID(PID)、文件所有者(USER)、文件描述符(FD)、文件类型(TYPE)等。例如,cwd列显示应用程序的当前工作目录,而txt类型代表程序代码。文件描述符从3开始,最初用于标准输入、输出和错误流。使用lsof,你可以追踪日志位置、检查文件使用情况,甚至验证...

松桃苗族自治县13760649159: 文件描述符 - 搜狗百科
犹何里素: http://baike.baidu.com/view/1303430.htm

松桃苗族自治县13760649159: 文件描述符标志是什么 -
犹何里素: 文件描述符是非负整数.打开现存文件或新建文件时,内核会返回一个文件描述符.读写文件也需要使用文件描述符来指定待读写的文件.习惯上,标准输入(standard input)的文件描述符是 0,标准输出(standard output)是 1,标准错误(...

松桃苗族自治县13760649159: 文件描述符和文件指针的区别与联系 -
犹何里素: 文件描述符:在linux系统中打开文件就会获得文件描述符,它是个很小的正整数.每个进程在PCB(Process Control Block)中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针.文件指针:C语言中使用文件指针做为I/O的句柄.文件指针指向进程用户区中的一个被称为FILE结构的数据结构.FILE结构包括一个缓冲区和一个文件描述符.而文件描述符是文件描述符表的一个索引,因此从某种意义上说文件指针就是句柄的句柄(在Windows系统上,文件描述符被称作文件句柄).

松桃苗族自治县13760649159: 什么是标记库描述符文件 -
犹何里素: 文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket. 第一个打开的文件是0,第二个是1,依此类推.Unix 操作系统通常给每个进程能打开的文件数量强加一个限制.更甚的是,unix 通常有一个系统级的限制.

松桃苗族自治县13760649159: perl =文件描述符是什么意思 -
犹何里素: 是说=cut=item =back 之类的吗,这个是perldoc方便生成文档的

松桃苗族自治县13760649159: C语言中文件的组成是什么 -
犹何里素: 楼主,你好,根据我学数据库系统原理来说,记录就是指数据. 楼主你补充的那句话是正确的,c语言是把文件看作是一个字符(字节)的序列,即是由一个一个字符(字节)的数据顺序组成的.由此看来,C语言中文件并不是由记录组成的.更简单一点说,数据就是好像,我叫张三,学号是08,张三和08就是一条记录.而C语言中会不会有出现这样的语句?楼主看到这里理解了吧?另外一个,数据的组织形式又有两种,可分为ASCII代码和二进制文件.

松桃苗族自治县13760649159: c语言文件描述词 -
犹何里素: fd文件描述符,打开的文件都有一个fd,fd对应内存中文件管理数据结构,也就是很多国人写的教材中所谓的FCB(文件控制块),类unix系统的文件IO操作有关的系统调用都使用fd作为其参数,如write,read,dup,dup2,fcntl和访问文件属性信息的函数之类的,因此,fd类似windows平台的文件操作API所使用的文件句柄.c语言中文件io操作的库函数是基于FILE结构,FILE只是对file descriptor做了封装.记住 stdin对应的fd为0,stdout为1,stderr为2,如果你打开的文件的fd

松桃苗族自治县13760649159: 1试比较文件名称文件号文件描述符之间关系2将文件控制快分为两个部分有何好处对此目录象中包含那些成分 -
犹何里素: 第一个问题: 文件名是文件的外部名字,通常是一个符号名(字符串),同一文件可以有多个文件名(如通过link).文件号是文件的内部名字,通常是一个整数,文件号与文件具有一一对应的关系.文件描述符是文件打开时返回的整数(入口...

松桃苗族自治县13760649159: c语言文件类型指针 -
犹何里素: c语言文件类型指针是通过FILE *fp; 这种形式进行定义的. 关于FILE结构在VC6中有如下定义: #ifndef _FILE_DEFINED struct _iobuf { char *_ptr; //文件输入的下一个位置 int _cnt; //当前缓冲区的相对位置 char *_base; //指基础位置...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网