【问题标题】:Read from a file in C while its being written externally在外部写入时从 C 中的文件读取
【发布时间】:2011-11-07 12:24:54
【问题描述】:

我想编写一个小型 C 程序,该程序在主动写入文件时从文件中读取。有什么想法吗?

【问题讨论】:

  • 您对您的要求有更详细的说明吗?你到底在读什么,它是如何被修改的?您是否正在寻找更改(任何地方)、添加到末尾的行或其他内容?
  • 这不是一个好主意。 IO 子系统处理何时从输出缓冲区刷新数据并实际写入文件。除非您可以强制该程序刷新其输出缓冲区(也就是说,您可以控制该程序的代码),否则您将获得非常“块状”的更新。如果你可以控制代码,还有更好的方法在程序之间传递消息。
  • 这并非不可能,但如果您不告诉我们您有什么问题,我们真的无法帮助您?
  • 如果可以避免的话,这根本不是一个好主意。
  • 不幸的是,我不是专家,所以如果我完全错了,你们必须原谅我。我正在尝试将输出从 USB 键盘发送到进程。我想也许从“/dev/input/by-id/usb-”中读取会给我想要的输入。如果我使用 scanf 我会从我不想的标准输入中读取。只需从 USB 设备读取输入即可。

标签: c linux io


【解决方案1】:

如果您可以控制写入过程,您应该在阅读器和写入器中使用mmap()MAP_SHARED。这样,读者几乎可以立即看到作者所做的更改。

另外,请注意,当您打开文件时,Linux 不会对文件中的数据进行任何快照,因此即使您只使用 read()lseek(),您也应该看到文件中所做的更改.

为了确定文件是否在 Linux 中被修改/打开/访问/等,您可以使用 inotify API(请参阅 inotify manpage)。这使您可以让您的进程等待您感兴趣的事件直到它发生(而不是定期轮询它)。您也可以使用epoll() 或更传统的select() 来完成类似的结果。

【讨论】:

  • 你能分享/建议任何实际的例子吗?
【解决方案2】:

我认为tail -f 正是您想要的,不是吗?看一下源代码: http://www.gnu.org/s/coreutils/

或者这个(不确定是否更新):http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/tail.c

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-23
    • 2020-03-06
    • 1970-01-01
    • 2017-06-22
    • 2020-06-24
    • 2017-01-25
    • 2021-03-17
    • 1970-01-01
    相关资源
    最近更新 更多