2

我正在用 C 语言为 Minecraft 服务器编写一个 inotify 观察程序。基本上,它监视 server.log,获取最新行,解析它,以及它是否匹配正则表达式;执行一些动作。

该程序通过“匹配正则表达式>> server.log的回显字符串”正常工作,它解析并执行它应该做的事情。但是,当字符串通过 Minecraft 服务器自动写入文件时,在我关闭服务器或(有时)注销之前它不起作用。

我会发布代码,但我想知道它是否与 ext4 将数据刷新到磁盘或类似的东西无关;文件系统问题。但是,如果是这种情况会很奇怪,因为“tail -f server.log”会在文件更新时更新。

4

3 回答 3

3

解决了我自己的问题。事实证明,服务器写入日志文件的速度比观察者读取的速度要快;所以观察者失去了同步。

我通过在处理事件后添加一个检查来修复它“如果当前日志文件中的行数超过日志的记录长度,则重新处理文件直到两者相等。”

谢谢你的帮助!

于 2011-10-20T21:42:09.780 回答
1

大概是因为您正在监视IN_CLOSE事件,直到服务器关闭(并关闭日志文件句柄)才可能发生。有关调用的有效掩码参数,请参见man inotify(7) 。inotify_add_watch()我希望你会想要使用IN_WRITE.

于 2011-10-20T02:00:49.547 回答
0

您的理论很可能是正确的,操作系统正在缓冲日志文件,并且日志写入器没有刷新该缓冲区,因此所有内容都将保留在缓冲区中,直到文件关闭或缓冲区已满。一种快速的测试方法是启动日志到您知道它会将事件写入日志的位置,然后强制关闭它以使其无法关闭句柄,如果日志为空,则肯定是缓冲区。如果您可以获取文件句柄/描述符,则可以使用setbuf以降低性能为代价来删除缓冲。

于 2011-10-20T06:18:30.777 回答