我有一个 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/