1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【42】pipexで使うシステムコール(ファイル操作)

Posted at

こんにちは。

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(デフォルト)

・パイプやソケットへの書き込みも可能

・ディスクの容量不足や書き込み権限がない場合はエラー

・書き込み位置は自動的に更新される

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?