3

私の場合、選択関数は常にゼロを返します。これはタイムアウトであり、これは継続的に発生しているため、プロセスの CPU 使用率も最大 98% になります。タイムアウト値を設定する代わりに NULL を設定しようとしましたが、それでもゼロを返します。select の代わりに poll 関数も使用しました。同じ問題が世論調査にもありました。

これが私のコードの一部です。

while(1)
{        
    value = 0;
    selectTimeOut = 0;
    memset(buf,0,SIZE);
    FD_ZERO(&read_fds);
    FD_SET(fd, &read_fds);
    struct timeval tv;
    tv.tv_sec = 10;
    tv.tv_usec = 1000;
    fdmax = fd;

    //using select to reduce cpu utilization
    selectret = select(fdmax + 1,&read_fds,NULL,NULL,&tv);
    if (selectret == -1)
    {
       print_sync("/home/fes/syclogs.txt","Select fails");
       exit(0);
    }
    else
    {
        print_sync("/home/fes/syclogs.txt","Error set is %s",strerror(errno));
        if(!FD_ISSET(fd, &read_fds))
        {
            print_sync("/home/fes/syclogs.txt","Select Time Out");
            selectTimeOut = 1;
        }
    }
    if(selectTimeOut == 1)
        continue;
    noread  = read(fd,buf,SIZE);
}
4

2 に答える 2

1

あなたの論理は意味がありません。errnoselect() が -1 を返す場合にのみ興味深いものです。ゼロが返された場合、fds の準備ができていないため、タイムアウトが発生しており、他に何もテストする必要はありません。正の値が返された場合は、その数の準備ができている fd をループして処理する必要があります。

于 2011-05-19T10:33:14.643 に答える
0

ファイルの終わりまたは同様の状態をチェックしてみませんか? 記述子の EOF またはその他の例外的な状態は、この状況に完全に一致すると思います。

おそらく、記述子とコンテキストをさらに説明する必要があります。fdはどこから来たのですか?それはどのデータソースを表していますか?

デバッグ メッセージを見ると、通常のファイルの変更を監視しようとしているという結論に達するかもしれません。select がこのタスクに役立つとは思いません。

Tail ユーティリティ ソースは、ファイル監視コードの実装に役立つ場合があります。

于 2011-05-18T10:39:46.693 に答える