read()システムがどのようにブロックするのかわかりません。空のファイルを作成し、read()システムコールを使用して読み取ろうとしました。0を返します。
fd = open("Demo.txt",O_RDONLY);
n = read(fd,&ch,10); // returns 0
ファイルにデータがないため、read()が無期限にブロックすることを期待しています。read()はEOFを有効なデータと見なし、すぐに返しますか?私の理解は正しいですか?
はい、EOF により read() はブロックではなく、すぐに戻ります。EOF に到達すると、 read() はファイルにさらにデータが書き込まれるのを待ちません。すぐに 0 バイトを返します。ディスク上のデータがメモリに読み込まれるときの通常はわずかな遅延を除けば、ディスク上のファイルから読み取るときはブロッキングは発生しません。
TTY、ソケット、およびパイプを操作する場合は、より関連性があります。たとえば、標準入力が端末に接続されているときに標準入力から読み取ると、ユーザーが何かを入力するまでブロックされます。相手側からデータを受信していない場合、ソケットからの読み取りはブロックされます。パイプからの読み取りは、パイプの反対側のプログラムが何かを書き込むまでブロックされます。
あなたの理解は正しいです。 read()
接続されたパイプまたはネットワークソケットから読み取る場合にのみブロックされます。
ここから:
read() は、ファイル記述子 fd から buf から始まるバッファーに最大 count バイトの読み取りを試みます。
通常のファイルをブロックすることはありませんread
。通常のファイルが空の場合、0 の戻り値 (ご覧のとおり) が期待されます。これは、ファイルから 0 バイトが読み取られたことを意味します。ファイルタイプ (FIFO/パイプなど) はブロックをサポートします行動。