2012-02-14 3 views
0

inotifyを使用してC/C++で複数のファイルをテーリングする場合、ファイルの最後まで読み込むと競合状態になるポーリングを開始する前にファイルが書き込まれますか?inotify(競合状態?)を使用しているC/C++(Linux)の複数のファイルをテーリングする

コードの関連部分は次のように起動します:ファイルが変更されたときに

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)) { 

ポーリング機能のみが返されていますか?次のシーケンスが発生した場合何が起こる:

  1. 世論調査では、シグナリングファイルは私がに開始
  2. は、そのファイルが、その後
  3. に追加されたファイルの最後まで読ん
  4. に追加されている返します投票

ファイルがもう一度追加されるまで私は立ち往生しますか? inotify_add_watch関数はファイル名だけを取るので、どこに残っているのか分かりません。

+0

ここに印象的なC-ishコードがあります。私はそれをC言語に捨ててしまいましたが、 'reinterpret_cast'はC++が必死にC言語であることを望んでいるので、それを取り除いています。 – Puppy

答えて

1

通知を作成した後にファイルの最後に読み取る必要があります。それ以外の場合は、この競合状態になります。通知を受け取ったら、の通知システムを再起動して、ファイルを読み取った後、ファイルを読み取った後に変更があったことを通知する必要があります。

+0

私は重視していると思います。しかし、良いアドバイス。 –

関連する問題