Linuxストリーム
概要
ストリームの定義
ストリームを管理するデータ構造はカーネルの中にある→ファイルディスクリプタで指定
データの経路を抽象化した
ストリームの先がどうやって繋げているかを意識せずに、ただストリームをシステムコールから獲得するだけでいい。
ストリームにはファイルをどこまで読んだかという状態が保持されている
readで前回の続きが返ってくることからも明か
ファイルオフセット
https://gyazo.com/022ea1901cee760c4d5750bcf2939644
FILE型は生のストリームにバッファ機能を追加する層である
read/writeなどのシステムコールとfread/fwriteなどのstdioライブラリとを一緒に使うと入出力の順番がおかしくなることがある
stdioは内部に独自のバッファを持っている
read/writeは当然そのバッファを経由しない
ストリームに関するシステムコール
read(2)
ストリームからバイト列を読み込む
write(2)
ストリームにバイト列を書き込む
open(2)
ストリームを作る
close(2)
ストリームを始末する
lseek(2)
ファイルオフセットを操作
dup(2),dup2(2)
ファイルディスクリプタを複製する
ioctl(2)
ストリームがつながる先にあるデバイスに特化した操作を全て含めたシステムコール
open,read,write,closeなどの綺麗なインタフェースからはみ出すような操作全てを行う
必要悪
ライブラリ
基本的にライブラリを使って操作するべきである
システムコールはUnix依存であるが、ライブラリはC標準なので他のカーネルでも有効
stdio
システムコールは関数呼び出しよりも遅いので頻繁に呼んでいると性能劣化がやばい
こういった問題をカバーしつつ利便性を向上するために標準入出力ライブラリが整備されている
stdioで中間バッファを持つ構造で読み書きに対応
https://gyazo.com/7e6e46893686a68241773ff7db4da4a0
https://gyazo.com/e103c6b510af3c92ebe9041c4f8372cf
システムコール→ファイルディスクリプタ
ライブラリ→FILE型
FILE型は生のストリームにバッファ機能を追加する層である
FILE型はファイルディスクリプタのラッパー
参照