c - 打开文件实际上是做什么的?

标签 c linux

在所有编程语言(至少我使用的)中,您必须先打开一个文件,然后才能对其进行读取或写入。

但是这个打开操作实际上是做什么的呢?

典型功能的手册页实际上并没有告诉你除了“打开文件进行读/写”之外的任何内容:

http://www.cplusplus.com/reference/cstdio/fopen/

https://docs.python.org/3/library/functions.html#open

显然,通过使用该函数,您可以知道它涉及创建某种便于访问文件的对象。

另一种说法是,如果我要实现一个 open 函数,它需要在 Linux 上做什么?

最佳答案

在几乎每一种高级语言中,打开文件的函数都是对应内核系统调用的封装。它也可以做其他花哨的事情,但在现代操作系统中,打开文件必须始终通过内核。

这就是为什么 fopen 库函数或 Python 的 open 的参数与 open(2) 系统调用的参数非常相似的原因.

除了打开文件之外,这些函数通常会设置一个缓冲区,随后将用于读/写操作。这个缓冲区的目的是保证每当你想读取 N 个字节时,对应的库调用都会返回 N 个字节,而不管对底层系统调用的调用是否返回更少。

I am not actually interested in implementing my own function; just in understanding what the hell is going on...'beyond the language' if you like.

在类 Unix 操作系统中,成功调用 open 会返回一个“文件描述符”,它只是用户进程上下文中的一个整数。因此,这个描述符被传递给任何与打开的文件交互的调用,并且在对其调用 close 之后,描述符变得无效。

请务必注意,对 open 的调用就像一个验证点,在此进行各种检查。如果不是所有条件都满足,则调用失败并返回 -1 而不是描述符,并且错误类型在 errno 中指示。基本检查是:

  • 文件是否存在;
  • 调用进程是否有特权以指定的模式打开该文件。这是通过将文件权限、所有者 ID 和组 ID 与调用进程的相应 ID 相匹配来确定的。

在内核的上下文中,进程的文件描述符和物理打开的文件之间必须存在某种映射。映射到描述符的内部数据结构可能包含另一个处理基于 block 的设备的缓冲区,或指向当前读/写位置的内部指针。

关于c - 打开文件实际上是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33495283/

相关文章:

linux - wxPython -- 转义的 & 符号在 Linux 中仍然不显示

linux - 如果使用 AND 条件,awk -F 找不到字符串

c++ - Netbeans 7 和 C/C++ block

c - MPI_Isend() 中的 MPI 段错误

c - Kdtree插入函数

java - 如何在 eclipse 上配置 tomcat 6?

c - spinlock_t 在第一次使用时已经锁定

c - 删除链表中M个节点后的N个节点

c - 如何在 centos 6.5 中 gdb 一个有段错误的核心文件?

linux - ArchLinux 上的 I2C 用户空间通信