システムコールでのファイルの操作 - C言語
ファイルディスクリプタとは
プログラムからストリームを扱うときに使う識別子のようなもの。プログラムから見るとただの整数値である。
プログラムから整数値(ファイルディスクリプタ)を指定することによって、ストリームを扱えるようになる。
ファイルディスクリプタはストリームと1対1で対応している識別子
標準入力、標準出力、標準エラー出力
プロセスには、必ず3つのファイルディスクリプタが初めから用意されている。 次の3つが使える
- 標準入力(0, STDIN_FILENO)
- 標準出力(1, STDOUT_FILENO)
- 標準エラー出力(2, STDERR_FILENO)
ストリームの読み書き
ストリームの読み書きにはread()
とwrite()
というシステムコールを使う。
read(2)
#include <unistd.h> ssize_t read(int fd, void *buf, size_t bufsize);
1行目の意味はこのAPIを使うためにはunistd.h
をインクルードしないと使えないよってこと。
read()はファイルディスクリプタfd番のストリームからbufsizeバイトだけ読み取り、bufへ格納する。
また、戻り値として、読み込んだバイト数を返す。ファイルをすべて読み込んだら0を返し、エラーが発生したら-1を返すようになっている。
write(2)
#include <unistd.h> ssize_t write(int fd, const void *buf, size_t bufsize)
write()はファイルディスクリプタfd番のストリームにbufからbufsizeバイトだけ書き込む。
また、戻り値として、正常に書き込めたときには書き込んだバイト数を返し、エラーが起きたときには-1を返す。
open(2)
#include <fcntl.h> int open(const char *path, int flags)
第1引数のpathのパスのファイルのストリームを作成し、そのストリームに紐付くファイルディスクリプタを返す。
もし、ファイルを開くことに成功した場合には、ファイルディスクリプタを返し、失敗した場合には-1
を返す。
flagsにはどのように開くかを指定する。読み取り専用とか。
close(2)
#include <unistd.h> int close(int fd)
指定したファイルディスクリプタに紐づくストリームを閉じる。
正常にストリームが閉じられた場合には 0 が返され、エラーが起きた場合には -1 が返される。そのため、以下のような記述になることが多い?
if (close(fd) < 0) { // エラー処理 }
参考文献
ふつうのLinuxプログラミング 第2版 Linuxの仕組みから学べるgccプログラミングの王道
- 作者: 青木峰郎
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2017/09/22
- メディア: 単行本
- この商品を含むブログを見る