是否可以在命名管道上进行 seek() 操作返回成功?

phe*_*mer 12 pipe syslog

有什么方法可以使当程序尝试seek()在命名管道上执行操作时它会成功返回(但就像管道是一个空文件一样)而不是“非法搜索”?

我的系统上的最后一点点日志都存储在 SQLite 数据库中,我在任何地方都没有文件。但是,有一些程序会遇到此问题。具体有2种情况;

  • 一个程序想要写入一个日志文件,syslog-ng 已将其创建为命名管道并从中读取。程序seek()出于某种原因想要执行 a然后失败。
  • 程序(例如 denyhosts 或 fail2ban)想要从 syslog-ng 创建为命名管道并正在写入的日志文件中读取。该程序想要对其执行 aseek()并失败。

理想情况下,我只是喜欢这些试图表现得好像命名管道只是一个空文件。我看不出写日志的程序无论如何都需要执行查找的任何原因,它应该只打开文件进行追加并开始写入。我可以理解为什么程序阅读会想要寻找,以便它可以从最后一个位置恢复,所以我希望它表现得好像文件是空的(就像它被截断了一样)。

那么是否可以在命名管道上设置一些选项来让它们以这种方式运行?如果没有,当 syslog-ng 打开管道时是否可以设置一种模式,让它以这种方式运行(我愿意进行代码更改)?还是我在一条小溪上?

Gil*_*il' 10

已经为 Linux 内核提出了可搜索管道,但我不知道实现它们的工作补丁。

您可以使用LD_PRELOAD'ed 库来覆盖lseek对特定文件的调用。我不知道有任何现成的包装用于此目的。Shadowfs可能有助于编写一个。