TIL

Today I Learned. 知ったこと、学んだことを書いていく

システムコールでのファイルの操作 - C言語

ファイルディスクリプタとは

プログラムからストリームを扱うときに使う識別子のようなもの。プログラムから見るとただの整数値である。

プログラムから整数値(ファイルディスクリプタ)を指定することによって、ストリームを扱えるようになる。

ファイルディスクリプタはストリームと1対1で対応している識別子

標準入力、標準出力、標準エラー出力

プロセスには、必ず3つのファイルディスクリプタが初めから用意されている。 次の3つが使える

ストリームの読み書き

ストリームの読み書きには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) {
    // エラー処理
}

参考文献