プログラミング 美徳の不幸

Ruby, Rails, JavaScriptなどのプログラミングまとめ、解説、備忘録。

ふつうのLinuxプログラミング 読書録①

・カーネルとOSの違い
Linuxカーネル」と「Linux OS」は違う。OSには、シェルや開発環境、GNOMEなど様々なソフトウェアパッケージが含意される。一方で、カーネルはただひとつのプログラムで構成されていて、コンピュータを構成するすべてのハードウェアとソフトウェアを管理している。

システムコール
ハードウェアと直接やりとりができるのはカーネルに限定されているので、ふつうのプログラムがハードウェアを操作したいときは、カーネルに直接的な処理を代行してもらう。そのために用いるのがシステムコールである。=> open, read, write, fork, exec, stat, unlink
使用する側から見て、システムコールの関数も通常のC言語関数と変わらない。この区別を厳密にしなければならないのはカーネルや基幹ライブラリを作るエンジニアだけ。

・プロセス
簡単に言えば、動作中のプログラムのこと。

・ストリーム
プロセスがファイルの内容にアクセスしたいとき、どうするか=>ファイルにつながるストリームを作ってもらえるようカーネルにシステムコールを使って頼む=>再びシステムコールを使って、ストリームを操作してファイルの中身を取り出す

バイト列の流れならどんなものでもストリーム、したがってプロセス-ファイルの流れ以外にも、プロセス-キーボードなどの間もストリームで繋がれる。

・パイプ
プロセス-プロセス間のストリームを特別にパイプと呼ぶ。

・ネットワーク通信
別のコンピュータのプロセス同士がストリームでつながることもある=ネットワーク通信

・端末
端末につながったストリームを読むとキーボードからの入力が得られ、端末につながったストリームに書くとモニタに文字を出力できる=端末は、ユーザとのやりとりをストリームによって抽象化、プロセスからもファイルと同じように操作できるようにするための仕組み。

・ファイルディスクリプタ
プロセスがファイルを読み書きしたり他のプロセスとやりとりするときにはストリームを使う。ストリームをプログラムから扱うには、ファイルディスクリプタ(あるいはファイル記述子、file descriptor)を使用する。
ファイルディスクリプタはプログラムから見るとただの非負の整数値である。カーネルの中に実際のストリームがあり、それに対応する番号をプロセスに見せている。

・特別なファイルディスクリプタ
プロセス開始時から用意される3つのストリーム
0 標準入力 STDIN_FILENO
1 標準出力 STDOUT_FILENO
2 標準エラー出力 STDERR_FILENO

・ストリームの読み書き
◯read(2)

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t bufsize);

ファイルディスクリプタfd番のストリームから最大bufsizeバイト読んでbufに格納する。
◯write(2)

#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t bufsize);

ファイルディスクリプタfd番のストリームにbufsizeバイト分をbufから書き込む。

・ファイルを開く
◯open(2)

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int open(const char *path, int flags);
int open(const char *path, int flags, mode_t mode);

flagsには以下のフラグを指定できる。
O_RDONLY 読み込み専用
O_WRONLY 書き込み専用
O_RDWR 読み書き両用

◯close(2)

#include <unistd.h>

int close(int fd);