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

Linux字符类型设备驱动程序,何时进行刷新调用,linux,linux-device-driver,kernel-module,Linux,Linux Device Driver,Kernel Module,我有一个LinuxChar设备驱动程序,在日志中我可以看到在驱动程序中调用flush函数调用,尽管我们从未在applictaion中显式调用flush 当调用刷新调用而不是释放调用时。在什么情况下,刷新调用将自动触发 从文件中我们可以理解 当进程关闭其设备的文件描述符副本时,调用flush操作;它应该在设备上执行(并等待)任何未完成的操作。这不能与用户程序请求的fsync操作相混淆。目前,flush仅在网络文件系统(NFS)代码中使用。如果flush为NULL,则不会调用它 但我想深入了解。 我

我有一个LinuxChar设备驱动程序,在日志中我可以看到在驱动程序中调用flush函数调用,尽管我们从未在applictaion中显式调用flush

当调用刷新调用而不是释放调用时。在什么情况下,刷新调用将自动触发

从文件中我们可以理解

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

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

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

为了更好地理解这一点,考虑一个过程,其中一个进程(第一次)打开一个(设备)文件,然后调用FoK()。p> 伪代码:

int fd = open("/dev/xxxxx", O_...);
...
fork()
...
这将导致打开的文件描述符表(OFDT)的ref计数保持为1(因为它被复制到子进程中),但FTE的(‘打开的文件’对象——它指向的对象)ref计数将增加到2,因为父进程和子进程现在都持有对它的引用

如果它们中的任何一个现在通过调用

close(fd);
该进程对文件的句柄将被关闭,FTE引用计数将减少到1,内核VFS将调用flush()方法!如果另一个进程也关闭该文件,ref计数将降至零,此时将调用flush()和release()。
HTH.

要在子进程退出时添加flush()/release()调用,而不是显式调用驱动程序句柄上的close调用。