Linux 字符类型设备驱动程序,何时进行刷新调用

标签 linux linux-device-driver kernel-module

我有一个 linux char 设备驱动程序,在日志中我可以看到在驱动程序中调用了刷新函数调用,尽管我们从未在应用程序中显式调用刷新。

何时将调用 flush 调用而不是 release 调用。在哪些情况下会自动触发刷新调用?

从文档中我们可以理解

当进程关闭其设备文件描述符的副本时,将调用刷新操作;它应该执行(并等待)设备上任何未完成的操作。这不能与用户程序请求的 fsync 操作混淆。目前,flush 仅用于网络文件系统 (NFS) 代码。如果 flush 为 NULL,则不会调用它。

但想深入了解。 我们使用linux 2.6.10

最佳答案

简单地说,文件对象的 flush 方法在任何一个 close() 时被调用,release 方法在打开的文件对象 (FTE) 的引用计数降为零时被调用。

为了更好地理解这一点,请考虑一个进程打开(设备)文件(第一次)并随后调用 fork() 的场景。

伪代码:

int fd = open("/dev/xxxxx", O_...);
...
fork()
...

这将导致打开文件描述符表 (OFDT) 的引用计数保持为 1(因为它被复制到子进程中),但 FTE(“打开文件”对象 - 它指向的)引用计数会增加到 2,因为父进程和子进程现在都持有对它的引用。

如果他们中的任何一个现在通过调用关闭文件

close(fd);

该进程的文件句柄将被关闭,FTE 引用计数将减少到 1,内核 VFS 将调用 flush() 方法!如果其他进程也关闭了文件,引用计数将降为零,flush() release() 现在将被调用。 HTH.

关于Linux 字符类型设备驱动程序,何时进行刷新调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24484649/

相关文章:

c - 将 UART 寄存器地址映射到内核以编写设备驱动程序

linux - 从 sleep_on() 到 wait_event()?

linux - 3G Internet stick - 哪个库使它起作用

Linux 内核模块读/写文件

缺少 Linux 模块文件

linux - SLURM:分配所有 GPU 后,无法提交更多 CPU 作业

c - 哪些部分构成可执行文件的大小?

linux - 在构建 linux 内核之前只清理选定的模块

java - 大型源文件上的 Netbeans 乱码文本 - Fedora

php - Apache 打开的文件太多 (24)