1

私はcygwinを実行しており、pselectを使用して子プロセスのソケットとファイル記述子を監視しています。

ここで見つけたいくつかの例によるとhttp://www.linuxprogrammingblog.com/code-examples/using-pselect-to-avoid-a-signal-raceとmanページのpselectは、設定されているファイル記述子の数を返す必要がありますマスク フィールド ( http://linux.die.net/man/2/pselect )。

サーバーに接続すると、pselectが返されますが、これは問題ありません。しかし、FD_ISSET を使用してファイル記述子をテストすると、常に true が返されます。

FD_ZERO(&readers);
FD_ZERO(&writers);
FD_ZERO(&exceptions);

FD_SET(fileno(stdin), &readers);
FD_SET(socket, &readers);
pret = pselect(FD_SETSIZE, &readers, &writers, &exceptions, NULL, &mSignalMask);

、&readers、&writers、&exceptions、NULL、&mSignalMask);

if(pret <= 0)
{
    // ignore for now
    continue;
}

if(FD_ISSET(fileno(stdin), &readers))
{
    string s;
    cin >> s;
    cout << "stdin: " << s << endl;  // blocks because the code always gets here even when 
                // pselect returns because of a childsignal without any data.
    continue;
 }

if(FD_ISSET(socket, &readers))
{
    accept();   // blocks because the code always gets here even when 
                // pselect returns because of a childsignal without any data.
    cout << "task created connection from " <<task->getClientHost() << endl;
    continue;
}
4

1 に答える 1

1

自分で問題を見つけました。FD_ISSET は、pselect からの結果が > 0 の場合にのみ使用できます。それ以外の場合、FD_ISSET からの戻り値は呼び出し前と同じです。したがって、pselect が <= 0 を返す場合は未定義として扱うのが最善です。

于 2013-04-29T08:49:40.320 に答える