前回はread
とwrite
について書きました。 今回はopen
とclose
について、簡単に書いていこうと思います。 まだ自分自身も勉強途中なので、ちゃんとは説明出来ないんですけどね...
以下は引数に指定したファイルをオープンして標準出力に表示するプログラムです。
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int fd;
ssize_t size;
char buf[1024];
if(argc != 2) {
write(STDERR_FILENO, "Error\n", 6);
return 1;
}
fd = open(argv[1], O_RDONLY);
if(fd == -1) {
write(STDERR_FILENO, "Error\n", 6);
return 1;
}
size = read(fd, buf, sizeof(buf));
write(STDOUT_FILENO, buf, size);
close(fd);
return 0;
}
システムコールopen
を利用するにはfcntl.h
を、close
を利用するにはunistd.h
をインクルードする必要があります。 open
の戻り値は非負整数のファイルディスクリプタを、失敗なら-1を返します。 close
は成功で0、失敗で-1を返します。
open
とclose
のインタフェースは以下の通り。
open
- int open(const char *path, int flag, ...);
close
- int close(int fd);
open
の第1引数path
はファイル名を指定します。 第2引数flag
はファイルの状態を示すフラグ(後述)を指定します。 close
の第1引数fd
閉じるファイルディスクリプタを指定します。
open
では読み書きのためにファイルを開いたり作成したりします。 んで、引数flag
に、ファイルを開く(あるいは作成する)時に、状態を指定します。 O_RDONLY
は読み込み専用で開く、O_WRONLY
は書き込み専用で開く、O_CREAT
はファイルが存在しなければ作成する、といったように 今回の場合、コマンド引数から指定したファイルを読み込みたいので、 O_RDONLY
を利用します。
ファイルの内容を読み込むわけですが、 開いているファイルから内容をbuf
に読み込むのにread
を利用します。 前回と異なる点は、open
の第1引数にfd
を指定して、ファイルの中身をbuf
に読み込んでいる点です。 buf
に取り込んだら、あとは前回のwrite
と同じです。 最後に、ファイルを閉じるために、close
に開いたファイルのディスクリプタfd
を渡します。
詳しくは、man 2 open
やman 2 close
とターミナルに入力してマニュアルを呼び出してみてください。
そういえば、前回、標準入力と標準出力のファイルディスクリプタのマクロを紹介しましたが、今回はエラー処理の出力に標準エラーのファイルディスクリプタを指定しました。 標準エラーのファイルディスクリプタは2なのですが、これもSTDERR_FILENO
というマクロが定義されています。
とりあえず、今回はここまで。 次はlseek
を触ってみようかなと考えてますが、まだしっかりとは考えてないです...