0

接続時に (フォークを使用して) 子を生成し、別の接続が入ってくると、パイプを使用してこの子に別のソケットを送信するサーバーを作成しています。プレーヤー ネットワーク ゲーム モード。

親と子の間の IPC パイプ変数は pfd[2] です。

基本的に、子プロセスではrecvmsg(pfd[0], &message, MSG_WAITALL)、親プロセスから 2 番目のソケットが渡されるのを待ちます。

ただし、recvmsg がブロックされることはなく、常に -1 が返されます。

次のように、すでに pfd[0] を BLOCKING に設定しています。

// set to blocking pipe
int oldfl;
oldfl = fcntl(pfd[0], F_GETFL);
if (oldfl == -1) {
    perror("fcntl F_GETFL");
    exit(1);
}
fcntl(pfd[0], F_SETFL, oldfl & ~O_NONBLOCK);

子を recvmsg でブロックするにはどうすればよいですか?

ヒントをありがとう。

4

1 に答える 1

1

recvmsg()パイプでは機能せず、ソケットのみで機能します。recvmsg()-1 を返す場合、値を確認する必要があります。errnoおそらくEBADFです。

パイプの代わりにUNIX ソケットを使用して、プロセス間でファイル記述子を渡すことができます。

于 2011-03-01T12:36:06.413 に答える