stdin と言うときは、fd=0 で参照されるストリームを指しています。
ブロックデバイスとキャラクターデバイスをカバーするOSコースを受講しています。具体的には、キーボードはキャラクターデバイスであると述べました。しかし、read
syscall を見せられたとき、それがブロック デバイスまたはブロック デバイス上のファイルである限り、カーネルは何から読み取っていてもかまわないと言われました。
与えられたコードは次のとおりです。
#include <stdlib.h>
#include <unistd.h>
const int BUFFSIZE = 5;
int main () {
int fd, n;
char buffer[BUFFSIZE];
int stdin = 0;
int stdout = 1;
int stderr = 2;
do {
n = read (0, buffer, BUFFSIZE);
if (n < 0) {
write (stderr, "Error occurred\n", 10);
} else {
write (stdout, "Entered if\n", 20);
write (stdout, buffer, n);
}
} while (n > 0);
return 0;
}
私の質問は、Linux は標準入力 (fd = 0) をどのように扱うのですか? キャラクターデバイスとして扱われますか、それともカーネルが何らかのバッファリングを行いますか (これは、コードを実行したときに得られた結果から判断することで可能性が高いと思われます)。
さらに、一般的なキャラクター デバイスからの読み取りに read syscall を使用できるかどうかを知っておくと便利です。その場合、入力はバッファリングされていますか?