我有一个linux char设备驱动程序,在日志中我可以看到在驱动程序中调用了flush函数调用,尽管我们从未在应用程序中显式调用flush。
当调用flush调用而不是release调用时。在所有情况下,刷新呼叫都会被自动触发?
从我们可以理解的文档中
当进程关闭其设备文件描述符的副本时,将调用刷新操作;它应该执行(并等待)设备上的任何未完成的操作。这不能与用户程序请求的fsync操作混淆。目前,flush仅用于网络文件系统(NFS)代码。如果flush为NULL,则不会调用它。
但是想深入了解。 我们使用linux 2.6.10
答案 0 :(得分:2)
简单地说,在 any close()上调用文件对象的flush方法,当打开文件对象(FTE)的引用计数降为零时调用release方法。
为了更好地理解这一点,请考虑一个过程打开(设备)文件(第一次)并随后调用fork()的场景。
伪代码:
int fd = open("/dev/xxxxx", O_...);
...
fork()
...
这将导致打开文件描述符表(OFDT)的引用计数保持为1(因为它被复制到子进程中),但是FTE('打开文件'对象 - 它指向的对象)引用了到2,因为父进程和子进程现在都拥有对它的引用。
如果其中任何一个现在通过调用
关闭文件close(fd);
该进程对该文件的处理将被关闭,FTE引用计数将减少为1,并且内核VFS将调用flush()方法!如果其他进程也关闭了文件,则引用计数将降为零,现在将调用flush()和 release()。 HTH。