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

C++ &引用;“拖尾”;C/C+中有多个文件+;(Linux)使用inotify(竞争条件?),c++,linux,race-condition,inotify,C++,Linux,Race Condition,Inotify,在C/C++中使用inotify跟踪多个文件时,当您读取到文件末尾,然后在开始轮询之前写入文件时,是否存在争用条件的风险 相关代码的开头如下所示: 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));

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

相关代码的开头如下所示:

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)) {
while(true){
结构pollfd pfd={fd,POLLIN,0};
int-ret=poll(&pfd,1,30000);//超时30秒
如果(ret>0){
size_t len=读取(fd、buf、sizeof(buf));
对于(尺寸e=0;ewd){
++一,;
}
如果(ev->掩码和IN_修改){
文件*f=ff[i];
fseek(f,位置[i],搜索集);
while(fgets(直线[i]+偏移[i],最大直线长度,f)){
poll函数是否仅在修改文件时返回?如果发生以下顺序,会发生什么情况:

  • 轮询返回信号文件已添加到
  • 我一直读到文件的结尾
  • 然后文件被添加到
  • 然后我开始投票

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

    您必须在创建通知后读取到文件的结尾。否则,您就完全处于这种竞争状态。当您收到通知时,您必须在读取文件之前重新配置通知系统,以确保您在读取文件后收到任何更改的通知。

    您这里有令人印象深刻的C-ish代码。我几乎把它作为C删除,但是<代码> RealTytRask把它作为C++来拼命地希望它是C.,我认为强调属于后,而不是必须。但是好的建议。