使用inotify(竞争条件?)在C / C ++(Linux)中“拖尾”多个文件

时间:2012-02-14 01:09:56

标签: c++ linux race-condition inotify

使用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. 然后我开始投票
  5. 我会被卡住,直到再次添加文件为止?由于inotify_add_watch函数只接受文件名,因此不知道我“离开”了哪里?

1 个答案:

答案 0 :(得分:1)

创建通知后,必须读取到文件末尾。否则,你就有这种竞争条件。收到通知后,您必须在读取文件之前重新启动通知系统,以确保您在阅读文件后收到任何更改通知。