【问题标题】:"tailing" multiple files in C/C++ (Linux) using inotify (race condition?)使用inotify(竞争条件?)在C/C++(Linux)中“拖尾”多个文件
【发布时间】:2012-02-14 09:33:08
【问题描述】:

当使用 inotify 在 C/C++ 中拖尾多个文件时,当您读取到文件末尾,然后在开始轮询之前写入文件时,是否存在竞争条件的风险?

相关的代码开头如下:

while (true) {
  struct pollfd pfd = { fd, POLLIN, 0 };
  int ret = poll(&pfd, 1, 30000);  // timeout 30s
  if (ret > 0) {
    size_t len = read(fd, buf, sizeof(buf));

    for (size_t e = 0; e < len; ) {
      inotify_event *ev = reinterpret_cast<inotify_event*>(&buf[e]);

      int i = 0;
      while (wds[i] != ev->wd) {
        ++i;
      }

      if (ev->mask & IN_MODIFY) {
        FILE* f = ff[i];
        fseek(f, pos[i], SEEK_SET);

        while (fgets(line[i]+offsets[i], MAX_LINE_LENGTH, f)) {

poll函数是否只在文件被修改时才返回?那么如果发生以下顺序会发生什么:

  1. 已将轮询返回信号文件添加到
  2. 我一直读到文件结尾
  3. 然后文件被添加到
  4. 然后我开始投票

在文件被再次添加之前,我会被卡住吗?由于 inotify_add_watch 函数只接受文件名,它不知道我“离开”了哪里?

【问题讨论】:

  • 这里有令人印象深刻的 C-ish 代码。我几乎放弃了它作为 C,但 reinterpret_cast 放弃它,因为 C++ 拼命希望它是 C。

标签: c++ linux race-condition inotify


【解决方案1】:

必须在创建通知后阅读到文件末尾。否则,您将完全符合这种竞争条件。当您收到通知时,您必须在阅读文件之前重新武装通知系统,以确保在阅读文件后收到有关发生任何更改的通知。

【讨论】:

  • 我认为重点在于之后,而不是必须。但是很好的建议。
猜你喜欢
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
相关资源
最近更新 更多