読み取ることができないfdsがたくさんあります(たとえば、リスニングソケット)。データを取り出すリスクを冒さずread
に、fdの(2)が返されるかどうかをテストするにはどうすればよいですか?EINVAL
動作しないもの:
read()
渡されたゼロバイトのバッファでを行うことができます。ただし、これは除外されます。read()
実装は、ゼロバイトの要求に対してエラーチェックを実行することを許可されていますが、必須ではありません。[POSIX1003.1-2008から]select()
記述子を呼び出したくなるかもしれません。残念ながら、select()
読み取り可能なセットのセマンティクスは非常にオーバーロードされているため、実際にはfdを呼び出すとエラーが発生したときに、fdが「読み取り可能」であることがわかりますread()
(たとえば、リスニングソケットは「読み取り可能」とマークされますが、、accept()
ではなくread()
、が必要です。イベントやkqueuefdsのような他の移植性のない例があります)。(作業の並べ替え)特定のシステムコールを使用してfdをテストし、コンパイルするすべてのプラットフォームのマンページを読んで、おおよそ次のような関数を生成します。
int isReadable(int fd) { return isActiveSocket(fd) || isFifo(fd) || isRegFile(fd) || isEventFd(fd) || ... /* more pain */ }
(作品の並べ替え)
read()
fdがシステムコールに適切なタイプであったかどうかについて、それ自体が必ずしも良い答えを与えるとは限らないことに注意してください!驚いたことに、EINVAL
POSIX forread()
(STREAMSを除く)では指定されていませんが、Linux( "EINVAL:fdは読み取りに適さないオブジェクトにアタッチされています")ではなく、BSD( "EINVAL:に関連付けられたポインター[fd]は負でした。」)。
シナリオ
誰かがあなたのアプリケーションを起動し、あなたは値0のfdが偽物(例えばリスニングソケット)であるかどうか、またはそれから読み取ることが可能になるかどうかを知りたいと思っています。read()
実際のa)ブロックするため、b)データを取り出した後、データを元に戻すことができないため、実際に試さずにやりたいと思います。