3

私はpollselectおよび同様の機能について学習しており、「ブロックする」というステートメントに常に悩まされています(これは、Linux用のドライバーの構築について読んでいる本とおよびのmanページの両方に表示されますpollselect。私は本当にこれを取得しません。何がブロックされますか?ファイル記述子の読み取り/書き込みを行うプロセスは?現在のプロセスがファイルに対して読み取り/書き込みを行っているときに、他のプロセスがそのファイルに対して読み取り/書き込みを行うことができないという意味で、読み取り/書き込み操作自体はどうでしょうか。

これがばかげた質問である場合は申し訳ありませんが、どこでもこの質問の答えを見つけるのに苦労しています。

4

3 に答える 3

3

ブロックするとは、システム コールを実行するプロセスが、システム コールが戻るまでブロック (待機) することを意味します。たとえば、プログラムにファイルの読み取りを要求した場合、読み取りコマンドを発行した後、オペレーティング システムが読み取りを実行して結果をプログラムに返すまで、プログラムは待機 (ブロック) します。

複数のプログラムが同じファイルにアクセスする場合、複数のプロセスが同じファイルを読み取ることができます。ただし、1 つまたは複数のプロセスが同じファイルを読み取っているファイルに書き込みを行っているときに、競合状態が発生する可能性があります (通常はそうなります)。言い換えると、ブロッキングはファイルにアクセスする単一のプロセスに関するものであり、同じファイルにアクセスする 2 つのプロセス間の操作 (読み取りと書き込みなど) の順序については保証しません。(何らかの理由でファイルについて考えていました。パイプとソケットの読み取り/書き込み特性は、ファイルシステム上のファイルの特性とは大きく異なります)。

于 2012-09-24T15:49:30.457 に答える
2

別の言い方をしましょう。

1)通常のI/Oは「ブロッキング」です。「読み取り」を発行すると、プログラムはデータが到着するまで、またはエラー(またはタイムアウト)が発生するまで「待機」します。

2)ノンブロッキングI/Oは「異なります」。「完了」したかどうかを判断する方法が必要です。

3)「読み取り」の場合、EWOULDBLOCKは「データがありません」と言います。「これが「通常のI/O」の場合、ブロックします」と言っています。

4)「書き込み」の場合、EWOULDBLOCKは、「最初のバッファーはまだ完全に送信および確認されていません。他の何かを送信する前に保留することをお勧めします」と言っています。

2つのリンク:

于 2012-09-24T16:30:16.913 に答える
2

ジェフの正解に加えて:

ただし、対応するファイル記述子をノンブロッキング モード (O_NONBLOCK) で開くと、これらのシステム コールのほとんどをノンブロッキングで使用できます。呼び出しは常にすぐに返されますが、失敗すると errno に EWOULDBLOCK が返され (有効なデータがありません)、アプリケーションまたはドライバーでこれを自分で処理する必要があります。

于 2012-09-24T16:05:37.970 に答える