-1

サーバー コードでは、pselect を使用して、クライアントが接続するのを待機し、作成してクライアントに送信するプロセスの標準出力を監視します (単純化されたリモート シェルのように)。

pselect の使用方法の例を見つけようとしましたが、見つかりませんでした。クライアントが接続できるソケットは、accept() で確認したように、既にセットアップされ、機能しています。SIGTERM がブロックされています。

pselect を使用しようとするコードは次のとおりです。

waitClient()
{
    fd_set readers;
    fd_set writers;
    fd_set exceptions;
    struct timespec ts;

    // Loop until we get a sigterm to shutdown
    while(getSigTERM() == false)
    {
        FD_ZERO(&readers);
        FD_ZERO(&writers);
        FD_ZERO(&exceptions);

        FD_SET(fileno(stdin), &readers);
        FD_SET(fileno(stdout), &writers);
        FD_SET(fileno(stderr), &writers);
        FD_SET(getServerSocket()->getSocketId(), &readers);
        //FD_SET(getServerSocket()->getSocketId(), &writers);

        memset(&ts, 0, sizeof(struct timespec));
        pret = pselect(FD_SETSIZE, &readers, &writers, &exceptions, &ts, &mSignalMask);

        // Here pselect always returns with 2. What does this mean?
        cout << "pselect returned..." << pret << endl;
        cout.flush();
}
}

したがって、私が知りたいのは、イベントが受信されるまで pselect で待機する方法です。現在、pselect は常に値 2 ですぐに返されるためです。タイムアウトを NULL に設定しようとしましたが、何も変わりません。

pselect の戻り値 (正の場合) は、イベントの原因となったファイル記述子ですか?

私は fork() を使用して新しいプロセスを作成しています (まだ実装されていません)。私も彼らを待ってもいいですか?シグナル SIGCHILD をチャットする必要があると思いますが、それをどのように使用しますか? 子の wait() もブロックするか、単に覗いてから pselect を続行できます。

4

1 に答える 1