Is there an async way of knowing a file has change

2020-07-18 05:13发布

问题:

I would like to asynchronously monitor a file for any changes. That is I would like to have a call back (possibly from kernel) in my program when the file has been modified/deleted. The file is just a plain text file. I know one can do this using a polling mechanism, but I am looking for an event based solution. I read about inotify, but looks like it needs patching of my kernel.

If the solution is POSIX compliant, its even better.

回答1:

Inotify was merged to the Linux kernel way back in 2005, so unless you're in a very old system, you should be able to use it out of the box.

I don't think there exists a POSIX compliant solution for this. Mac OS X has FSEvents.

Also check the man page for inotify.

EDIT:

Don't know about your constraints and/or requirements, but there is also GFileMonitor if you use Glib (the C++ binding is glibmm) and QFileSystemWatcher is you use Qt. Those are probably more cross-platform friendly.



回答2:

SGI's fam has been ported to several Unixes. There's also gamin.



回答3:

1)

write a device driver that creates a file called /dev/special_file.

symlink your plain text file to /dev/special file

intercept the low-level read/write operations to modify the real text file, called /path/to/text.txt, then generate the callback via signals or some type of interprocess comm to whatever process you want.

2)

have a process open your text file and just sit and wait. use select() to detect when that file has been modified, then do callback routine.