10

これは、「man select」のコードサンプルに、書き込まれている実際のファイルを読み取るための数行を加えたものです。に./myfile.txt書き込まれると、selectそのfdから読み取ることができるようになると思いました。しかし、txtファイルが存在する限り、selectは常にwhileループに戻ります。新しいデータがファイルの最後に書き込まれたときにのみ返されるようにしたい。私はそれがどのように機能するべきかと思いました。

#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

int
main(void)
{
    fd_set rfds;
    struct timeval tv;
    int retval;

    int fd_file = open("/home/myfile.txt", O_RDONLY);

   /* Watch stdin (fd 0) to see when it has input. */
    FD_ZERO(&rfds);
    FD_SET(0, &rfds);
    FD_SET(fd_file, &rfds);

   /* Wait up to five seconds. */
    tv.tv_sec = 5;
    tv.tv_usec = 0;

   while (1)
   {
     retval = select(fd_file+1, &rfds, NULL, NULL, &tv);
     /* Don't rely on the value of tv now! */

     if (retval == -1)
        perror("select()");
     else if (retval)
        printf("Data is available now.\n");
        /* FD_ISSET(0, &rfds) will be true. */
     else
        printf("No data within five seconds.\n");
   }

   exit(EXIT_SUCCESS);
}
4

1 に答える 1

17

ディスク ファイルはいつでも読み取る準備ができています (ただし、既にファイルの最後にいる場合は、読み取りで 0 バイトが返されることがあります)。そのためselect()、新しいデータがいつファイルに追加されたかを調べるために on ディスク ファイルを使用することはできません。

POSIX 言います:

通常のファイルに関連付けられたファイル記述子は、読み取り準備完了、書き込み準備完了、およびエラー条件に対して常に true を選択する必要があります。

また、現在削除された投稿でcnicutarが指摘したように、一般に、反復ごとに FD_SET を初期化する必要があります。コードでは、1 つの fd を監視しており、その fd は常に準備ができているため、FD_SET は実際には変更されていません。ただし、監視する記述子が 5selectつあり、準備ができているのが 1 つだけであることを検出した場合、次の反復では、その 1 つの記述子のみが監視されます (FD_SET をリセットしない限り)。これにより、使用がselect難しくなります。

于 2012-08-10T12:57:41.987 に答える