あるプロセスには非ブロック記述子があり、他のプロセスには同じファイル/ソケットを参照するブロック記述子がありますか?

あるプロセスには非ブロック記述子があり、他のプロセスには同じファイル/ソケットを参照するブロック記述子がありますか?

私は通常のファイルよりもソケットに興味がありますが、基本的に1つのプロセスがソケットをブロックとして「見る」ことができ、他のプロセスがそれを非ブロックとして見ることができるかどうかを知りたいです。私の考えではそうです。カーネルは、システムコールに使用されたオプションに基づいてこれらすべてを処理します。

私はこれがTCPソケットよりUnixドメインソケットに近いと思います。これは、2つの異なるプロセスが同じTCPソケットを使用できるとは思わないからです(しかし間違っているかもしれません)。

ベストアンサー1

あなたは間違って推測しました。

これただ属性はファイル記述子によって異なり、fcntl(F_SETFD)close-on-exec フラグを使用して変更できます。FD_CLOEXEC

他のすべてのプロパティは、ファイル固有のオブジェクト(POSIX用語で「オープンファイルの説明」 - を使用して変更できますfcntl(F_SETFL))またはinode固有です。

fcntl(F_SETFL, | O_NONBLOCK)またはを使用して非ブロックフラグを設定すると、開いているファイルをioctl(FIONBIO)参照するすべてのファイル記述子に影響します。読み取りまたは書き込み時にのみファイルを非ブロック状態にする方法はありません。

これは遠く理想的 - 以下を参照することもできます。これStackOverflowへのQ&A、特にlmlへのリンク議論するどういうわけかそれを修正しようとして失敗した試みについて。

通常のファイルは本質的に非ブロックです。 ORを使用するとすぐに返されpoll(2)ます。select(2)

ソケットにのみ興味がある場合は、ORの代わりにsend(2)ORrecv(2)フラグを使用する必要があります。あなたが言うのとは異なり、ソケットファイル記述子は、ファミリ/プロトコル/オプションに関係なくプロセス間で共有できます。これはリスニングソケットでも機能します。MSG_DONTWAITread(2)write(2)

おすすめ記事