0

Linux でシリアル ポート アプリケーションに取り組んでいます。select () api が待機中のハンドルのデータをチェックすると、データがポートに到着すると正の値が返されますが、read() api 呼び出しは -1 を返します。

4

1 に答える 1

1

マニュアルページの内容は次のselectとおりです。

select() と pselect() を使用すると、プログラムは複数のファイル記述子を監視し、1 つまたは複数のファイル記述子が何らかのクラスの I/O 操作 (たとえば、入力可能) に対して「準備完了」になるまで待機できます。ブロックせずに対応する I/O 操作 (read(2) など) を実行できる場合、ファイル記述子は準備完了と見なされます。

ファイル記述子 (たとえば、ネットワーク ソケットで受信した RST セグメント) にエラー状態がある場合、現在ブロックされているプロセスに通知する唯一の方法は、selectこの記述子を IO の準備を整えることです。後続の読み取り/書き込み関数は、アプリケーションが処理できるようにエラーを返します。

この動作は、次の約束に準拠しているように見えます-非ブロッキングselectIOを実行できる場合は、記述子に準備完了のフラグを立てます(ただし、ネットワークソケットには、記述子に読み取り準備完了のフラグが付けられている場合がありますが、その後の読み取り操作ブロック)。読み取り時にブロックしません-エラーがすぐに返されます。

の戻りステータスに関してはselect、すべてのセットのファイル記述子の「準備完了イベント」の数のみを返す必要があります。select 自体が失敗した場合 (たとえば - などのシステム コールによって中断された場合) は負になる可能性がありますが、errno == EINTR監視されている記述子でエラーが発生した場合はそうではありません。

于 2012-08-07T07:31:51.873 に答える