I/Oとは?
入出力(I/O)はメインメモリとディスク・ドライブ、ターミナル、ネットワークなどの外部デバイスとの間でデータをコピーする手段である。
| 操作 | 役割 | 関数 |
|---|---|---|
| 入力操作 | I/Oデバイスからメイン・メモリにデータをコピーする | read |
| 出力操作 | メイン・メモリからI/Oデバイスにデータをコピーする | write |
ハイレベルI/OはシステムレベルUNIX I/O関数を用いて実装される。
UNIX I/O
LinuxカーネルはUNIX I/Oと呼ばれる、シンプルなローレベルアプリケーションインターフェースを提供する。
Linuxはデバイスのファイルへの洗練されたマッピングを行う。ネットワーク、ディスク、ターミナルなどのすべてのI/Oデバイスはファイルとしてモデル化され、すべての入出力は適切なファイルを読み書きする。
| 操作 | 説明 | 関数 |
|---|---|---|
| ファイルのオープン | アプリケーションからカーネルに対応するファイルをオープンするように要求する。カーネルはディスクリプタ(非不整数)を返す | open |
| 現在のファイルポジションの変更 | カーネルはオープンされたファイルについて、初期値が0のファイルポジションを管理する。ファイルポジションはファイル先頭からのバイトオフセットである。アプリケーションはシーク操作を行うことで、明示的に現在のファイルポジションkを設定できる。 | seek/read/write |
| ファイルの読み書き | ファイルからメモリにnバイトをコピーする。ファイルポジションkから開始し、kをnだけ増加させる。最後まで読み取るとファイル終端(EOF)と呼ばれる状態になる。状態であり、EOF文字は存在しない。書き込み操作はその逆を行う。 | read/write |
| ファイルのクローズ | カーネルにファイルへのアクセス終了を要求する。カーネルはファイルがオープンしたときに作成したデータ構造を解放し、利用可能なデスクリプタのプールにそのデスクリプタを戻すことで応じる。 | close |
標準I/Oとは?
標準I/OはUNIX I/Oのハイレベルな代替え手段を提供する。
| UNIX I/O関数 | 標準I/O関数 |
|---|---|
| open | fopen |
| close | fclose |
| read/gets | fread/fgets/scanf |
| write/puts | fwrite/fputs/printf |
標準I/Oライブラリは、オープンしたファイルをストリームとしてモデル化している。プログラマにとってストリームはFILE型の構造体へのポインタである。
FILE型のストリームは、ファイルディスクリプタとストリームバッファの抽象化である。ストリームバッファの目的は、コストの高いシステムコールの数を最小にすることである。
ファイル・タイプについて
ファイルタイプについては以下に別途まとめました。