3

我想知道调用 open() 系统调用时内核中会发生什么?它如何返回文件的文件描述符?

4

3 回答 3

3

内核在内部创建一个结构,其中包含有关您刚刚打开的文件的附加信息。该结构包含诸如inode编号、文件系统上文件的名称、文件大小、关联的超级块等信息……

事实上,在内核中VFS (Virtual File System),处理文件的 I/O 操作是在本地(在您的硬盘上)或远程(例如位于 FTP 服务器ftpfs上)。

GNU/Linux 上的每个文件系统都实现了相同的打开/读取/写入/关闭文件的机制。这确保了每个开发人员都不必担心他们试图访问什么样的文件,无论您与什么样的文件交互,都可以使用相同的 open()、read() ... API。您可以在此处此处找到有关VFS的更多信息(IBM 的精彩文章)。

最后,假设返回的每个文件描述符都open与您的程序相关,因此您可能打开的第一个文件将与文件描述符相关联3,依此类推......可以找出绑定到哪些文件描述符许多 GNU/Linux 发行版上的每个进程都通过/proc/{pid_of_your_process}.

于 2013-04-29T19:07:48.610 回答
1

如果您真的想深入研究,可以浏览许多 unix 变体的源代码。对于 linux,请查看http://lxr.linux.no/#linux+v3.9/fs/open.c - 搜索SYSCALL_DEFINE3(open, 以获取实际的“open”系统调用。

于 2013-04-29T20:30:31.293 回答
0

内核:

  • 查找文件(硬盘驱动器、USB、命名管道、标准流......)
  • 如果一切顺利,为自己保存一个您打开文件的描述符
  • 返回一个描述符
  • 如果您 close() 或进程退出,则释放有关您的 open() 的信息
于 2013-04-29T19:07:25.470 回答