ふつうのLinux
ふつうのLinuxプログラミング 第2版を読み始めたので、覚えたことを書いていく。自分用のメモである(つまり雑である)。
ストリーム
この本では、
- ファイルディスクリプタで識別されている
- open/close/read/write で操作できる
ものをストリーム、と読んでいる。「UNIXでは全てがファイルだ」という哲学というか標語というかは有名だが、その意味は、これだろう。 ファイルに対して行う典型的な処理を実装したAPIで、全てのデバイスやI/Oを扱ってしまおう、という気持ちだ。
FILE
read
やwrite
などのシステムコールは、ライブラリ関数と比べてコストが高い。
そのため、実用上、毎回これらを利用していると大変なボトルネックになってしまう。
そこで、stdio
というライブラリがある。これは、原始的なシステムコールをラップして、バッファリングなどを行い読み書きの効率性を高める役割を持っている。
もともとのストリームは、ファイルディスクリプタというintの値で識別されていたが、stdio
の世界ではFILE
構造体で識別される。
見よう見まねでコードを書いてるときは、ファイルディスクリプタだったりFILEだったりでややこしいなと思っていたんだが、 こういう設計になっていたんだと始めてしった。
fprintf
printf
は標準出力に吐くが、任意のストリーム(ファイルディスクリプタで管理されてるもの)に対して吐くにはfprintf
を使う。
fprintf(file, fmt, ...)
これを使うと、標準エラーにも吐ける。
fprintf(stderr, "Usage: %s <file>\n", argv[0]);
stderr
は、stdio.h
で定義されているFILE
構造体。
みたいな感じ。
perror
perror
に、文字列を渡すと、現在のERRNOに応じたメッセージとともに、その文字列を出力してくれる。
char *path = "not_exists_file";
open(path, O_RDONLY);
perror(path);
こんな感じに書いとくと、
not_exists_file: No such file or directory
みたいなよく見るメッセージが出てくる。