こんにちは。
42Tokyo本科生のなかじです。
今回は現在取り組んでいる”pipex”という課題で使うことが出来るシステムコールをまとめてみました。
そもそもシステムコールとは何か?
システムコールとは、OSカーネルの機能や関数を呼び出すために使用する機能です。
例えば、C言語においてはmalloc()という動的メモリ確保を行うライブラリ関数は、その関数内においてsrbk() というシステムコールを呼び出すことでヒープ拡張が行われています。
open()
使用目的
ファイルやデバイスをオープンしてファイルディスクリプタを取得する
新規ファイルの作成
既存ファイルへのアクセス権取得
使い方
int open(const char *pathname, int flags);
pathname: オープンするファイルパス
flags: アクセスモード(O_RDONLY/O_WRONLY/O_RDWR)とフラグの組み合わせ
戻り値
成功: 非負のファイルディスクリプタ
失敗: -1 (errnoにエラー詳細がセット)
特徴
・新しいfdはexecveを実行した後もopenされたままとなる
・引き数 flags には、アクセスモード
O_RDONLY(読み込み専用),
O_WRONLY(書き込み専用),
O_RDWR(読み書き用)
のどれかひとつが入っていなければならない。
・ファイルディスクリプタはプロセス固有
・複数のフラグを | で組み合わせ可能
・カレントワーキングディレクトリからの相対パス指定可能
close()
使用目的
ファイルディスクリプタを閉じる
システムリソースの解放
使い方
int close(int fd);
fd: 閉じるファイルディスクリプタ
戻り値
成功: 0
失敗: -1 (errnoにエラー詳細がセット)
特徴
・プロセス終了時に自動的に全てのfdがcloseされる
・fdはclose後に再利用される可能性がある
・書き込み中のデータは自動的にフラッシュされる
・同じfdを複数回closeすると未定義動作
read()
使用目的
fdからデータを読み込む
使い方
ssize_t read(int fd, void *buf, size_t count);
fd: 読み込み元のファイルディスクリプタ
buf: 読み込んだデータを格納するバッファ
count: 読み込む最大バイト数
戻り値
成功: 読み込んだバイト数(0はEOF)
失敗: -1 (errnoがセット)
特徴
・バッファサイズより少ないデータしか読めない場合がある
・ブロッキングI/O(デフォルト)
・パイプやソケットからの読み込みも可能
・読み込み位置は自動的に更新される
write()
使用目的
fdにデータを書き込む
使い方
ssize_t write(int fd, const void *buf, size_t count);
fd: 書き込み先のファイルディスクリプタ
buf: 書き込むデータが格納されているバッファ
count: 書き込むバイト数
戻り値
成功: 書き込んだバイト数
失敗: -1 (errnoがセット)
特徴
・要求したバイト数より少ない書き込みが発生する可能性(部分書き込み)
・ブロッキングI/O(デフォルト)
・パイプやソケットへの書き込みも可能
・ディスクの容量不足や書き込み権限がない場合はエラー
・書き込み位置は自動的に更新される