c++ - "tailing"C/C++ (Linux) 中使用 inotify 的多个文件(竞争条件?)

标签 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. poll returns signaling file has been added to
  2. 我一直读到文件的结尾
  3. 然后文件被添加到
  4. 然后我开始投票

我会卡住直到再次添加文件吗?由于 inotify_add_watch 函数只接受文件名,它不知道我“离开”的地方?

最佳答案

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

关于c++ - "tailing"C/C++ (Linux) 中使用 inotify 的多个文件(竞争条件?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9270404/

相关文章:

c++ - 使用依赖于 "this"c++ 的比较结构初始化一个集合

linux - 将 WiFi Dongle 与 Beaglebone Black-Issue 集成

java - Java 信号量的确定性如何保证?

python - 避免 Python 3 的多处理队列中的竞争条件

c++ - 在 C++ 中重载 < 运算符的问题

c++ - 检测到堆损坏 | C++

c++ - Visual Studio 在 vmware 中与 gcc/gdb 交叉编译 -> 内存访问错误

linux - 挂载失败,服务器给出的原因 : Permission denied

linux - 使用 linux 读取文件内容的问题

c++ - 等待条件变量破坏类