Unix环境编程之二:文件描述符、打开文件表、v节点关系详解

时间:2024-05-18 21:00:48

一、文件描述符概念

Linux 系统中,把一切都看做是文件,当进程打开现有文件或创建新文件时,内核向进程返回一个文件描述符,文件描述符就是内核为了高效管理已被打开的文件所创建的索引,用来指向被打开的文件,所有执行I/O操作的系统调用都会通过文件描述符。

二、文件描述符、文件、进程间的关系

1.描述:

每个文件描述符会与一个打开的文件相对应

不同的文件描述符也可能指向同一个文件

相同的文件可以被不同的进程打开,也可以在同一个进程被多次打开

2.系统为维护文件描述符,建立了三个表

进程级的文件描述符表

系统级的文件描述符表

文件系统的i-node表 (转到:阮一峰——理解inode)
Unix环境编程之二:文件描述符、打开文件表、v节点关系详解

3.深入了解三张表

Unix环境编程之二:文件描述符、打开文件表、v节点关系详解

在进程A中,文件描述符1和30都指向了同一个打开的文件句柄(#23),这可能是该进程多次对文件执行打开操作?
测试:同进程,前后两次对同文件同样打开,设置不同偏移量—>写入结果不同,有可能是打开文件句柄不同)

进程A中的文件描述符2和进程B的文件描述符2都指向了同一个打开的文件句柄(#73),这种情况有几种可能,
1.进程A和进程B可能是父子进程关系;
2.进程A和进程B打开了同一个文件,且文件描述符相同(低概率事件=_=)
3.A、B中某个进程通过UNIX域套接字将一个打开的文件描述符传递给另一个进程。

进程A的描述符0和进程B的描述符3分别指向不同的打开文件句柄,但这些句柄均指向i-node表的相同条目(#1936),换言之,指向同一个文件。发生这种情况是因为每个进程各自对同一个文件发起了打开请求。同一个进程两次打开同一个文件,也会发生类似情况。

原文链接:

https://segmentfault.com/a/1190000009724931