そのマニュアル ページによると、select()システム コールは、1 つまたは複数のファイル記述子の 3 つの異なる側面の監視を提供します: 読み取りの準備ができているか、書き込みの準備ができているか、または「エラー」または「例外的な状態」(言語が異なります) が発生しました。これらのうちどれを監視するかは、 、、 とfd_set
呼ばれる 3 つの引数で指定します。と の適切な使用法に関する優れたドキュメントと例はたくさんありますが、で役立つものはほとんど見つかりませんでした。readfds
writefds
errorfds
readfds
writefds
errorfds
とにかく、以下で説明する理由によりerrorfds
、試してみたところselect()
、実行ループ内の呼び出しがファイル記述子の 1 つで「例外的な状態」に応答する状況がいくつか見つかりました。たとえば、PTY に接続された TTY は、PTY がマスター側から閉じられている間に、このような状態を引き起こします。
しかし、今は何ですか?ファイル記述子で「例外的な状態」が発生したことは知っていますが、一般的に、その原因を正確に特定するにはどうすればよいですか? 確かに見ているだけでerrno
は答えは出ません(その時点では常に0です)。ioctl
私が知っておくべき「魔法」はおそらくありますか?
さらなる背景:多くの私のプログラム (ほとんどが C で書かれています) は、シリアル ポートを介して外部ハードウェアと通信します。テストのために、他のプログラムがシリアル ポートのように接続できる対応する TTY に PTY を作成する単純なサーバーも作成しました。基本的なレベルでは、これはすべてうまく機能していますが、エラーやその他の例外的な状況の処理は現在まったく実装されていないため、非常に厄介な動作が発生することがあります。これは変える必要があります!
私が特に関心を持っている例外的な条件の 1 つは、接続が切断されているかどうかです。たとえば、ユーザーが USB-to-serial アダプタを抜いたために、ポートがなくなったときに通知できれば便利です。読み取りエラーと書き込みエラーを適切に処理することで、最も厄介な意図しない副作用を回避できるように見えますが、errorfds
他にやるべきこと (監視、またはおそらく他のシグナル) があるかどうか疑問に思っていました。残念ながら、UNIX のシグナル処理については、私はまったく詳しくありません。