less than 1 minute read

ふつうのLinuxプログラミング 第2版を読み始めたので、覚えたことを書いていく。自分用のメモである(つまり雑である)。

ストリーム

この本では、

  • ファイルディスクリプタで識別されている
  • open/close/read/write で操作できる

ものをストリーム、と読んでいる。「UNIXでは全てがファイルだ」という哲学というか標語というかは有名だが、その意味は、これだろう。 ファイルに対して行う典型的な処理を実装したAPIで、全てのデバイスやI/Oを扱ってしまおう、という気持ちだ。

FILE

readwriteなどのシステムコールは、ライブラリ関数と比べてコストが高い。 そのため、実用上、毎回これらを利用していると大変なボトルネックになってしまう。 そこで、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

みたいなよく見るメッセージが出てくる。

タグ: ,

カテゴリー:

更新日時: