0

ネットワーク共有ファイル システム (NFS) 上には多くのファイルが生成されます。適切な解決策のない同様の質問があります: inotify with NFS

select() を使用して、ファイルに新しいデータが読み取れるかどうかをテストします。(実際、一部はソケット記述子から来ていますが、ここでは簡略化しています)。

しかし、ファイルの最後までファイルを見つけても、まだ読み取り可能な状態に戻ります。

このコードを書くためのより良い方法を提案できますか?

fd_set rfds;
struct timeval tv;
int retval;
int i,n,f1,f2,maxfd;
char buf[512];

f1 = fileno(fopen("f1", "rb"));
f2 = fileno(fopen("f2", "rb"));
maxfd = (f1 > f2) ? f1 : f2;

for (i=0; i<3; i++) {
    FD_ZERO(&rfds);
    FD_SET(f1, &rfds);
    FD_SET(f2, &rfds);

    tv.tv_sec = 5;
    tv.tv_usec = 0;

    retval = select(maxfd+1, &rfds, NULL, NULL, &tv);

    if (retval == -1)
        perror("select()");
    else if (retval) {
        printf("Data is available now.\n");
        if (FD_ISSET(f1, &rfds)) {
            n = read(f1, buf, sizeof(buf));
            printf("f1 is ready:%d read %d bytes\n", i, n);
        }
        if (FD_ISSET(f2, &rfds)) {
            n = read(f2, buf, sizeof(buf));
            printf("f2 is ready:%d read %d bytes\n", i, n);
        }
    } else
    printf("No data within five seconds.\n");
}

f1 と f2 に 3 バイトが含まれている場合、出力は次のようになります。

Data is available now.
f1 is ready:0 read 3 bytes
f2 is ready:0 read 3 bytes
Data is available now.
f1 is ready:1 read 0 bytes   <- I wish won't enter here
f2 is ready:1 read 0 bytes   <- I wish won't enter here
Data is available now.
f1 is ready:2 read 0 bytes   <- I wish won't enter here
f2 is ready:2 read 0 bytes   <- I wish won't enter here
4

2 に答える 2

0

NFS には、ファイルが変更されたときにクライアントに通知する方法がないため、残念ながら運が悪くなります。投票する必要があります。

于 2013-04-22T07:16:19.520 に答える