你的怀疑是正确的。:-)
如果在发生第二个相同事件时,kqueue“事件”不在被消耗的过程中,则它被“扩展”。也就是说,假设低级别的事件序列是这样的:
1: you start monitoring the log file for writes
2: something writes to the log file (this adds a "write" notice to the kqueue)
3: your process is notified, but does not have a chance to go look yet
4: something (same something as step 2, or different, does not matter)
writes more to the log file (this merely "expands" the existing notice,
with no effect in this case)
5: your process finally gets a chance to read the "file was written" notice
from the kqueue
当第 5 步发生时,“文件已写入”通知将只是一个通知。由您的代码决定写入了多少。例如,您可以fstat()
在第 1 步检查文件的长度,然后fstat()
在第 5 步之后检查另一个文件的长度。如果文件只是附加到,则这些点之间的大小差异就是您关心的“新数据”。
请注意,如果您在第 1 步看到(比如说)100 个字节,在第 5 步之后看到 500 个字节——比如说,在第 7 步:
7: you fstat the file
后来得到另一个“文件已写入”通知,实际上可能有一个“步骤 6”,文件发生了另一个写入。因此,即使您收到添加了字节的通知,您也应该准备好在后面的步骤中发现添加了 0 个字节,因为在将注释附加到 kqueue 之后您可能已经阅读了它们。
如果您正在观看syslog
类型日志,请注意它们会随着文件被重命名(然后有时会被压缩等)而“翻转”,并创建一个新文件,例如,“messages”变为“messages.0.bz2”和一个新的“消息”被创建。您可以查看目录以及文件,并检查是否有新文件创建,以捕捉此类情况。