用語集
プロセス
UNIX/Linux におけるプログラムの実行単位
UNIX/Linux において、「プロセス」とは現在実行中のプログラムのことを指す。全てのプロセスには「プロセスID (PID)」という番号が付与される。
/bin/ls はプログラム・コマンド・実行ファイルなどと呼ぶ。これをシェル上から
と実行したときにプロセスが生成される。プロセスは仕事 (ls の場合はファイル・ディレクトリの表示) を行い、それが終わったらプロセスが終了する。
現在実行中のプロセスは ps コマンドや top コマンドで確認することができる。
現在実行中のプロセスを終了させるには、kill コマンドを使う。
プロセスには必ず親となるプロセスが存在する (初めに起動される init は例外)。つまり「あらゆるプロセスは子プロセスである」と言える (init は例外)。子プロセスは親プロセスから以下の情報を引き継ぐ。
- 環境変数 (printenv などで参照・setenv・export などで変更可能)
- カレントディレクトリ (pwd で参照・cd で変更可能)
- ルートディレクトリ (chroot で変更可能)
- ファイル生成マスク (umask で参照・変更可能)
- リミット情報 (リソース制限。limit・ulimit で参照・変更可能)
- オープン中のファイルディスクリプタ
- 端末情報
実際はこの他にプロセスグループ・シグナルハンドラ情報・端末情報・リソース情報 (rusage)などが渡されるが、詳細は省略。
上記の情報を変更するコマンド (setenv・export・cd・umask・limit・ulimit) は全てシェルの内部コマンドであることに注意しよう。なぜなら、子プロセスから親プロセスの上記の情報を変更することはできないからである。仮に setenv コマンドがシェルの内部コマンドではなく、/bin/setenv という外部コマンドであったとしよう。
とするとシェルは fork して子プロセスを生成し、子プロセスは /bin/setenv を exec する。/bin/setenv は自身の環境変数 HOGE の値を fuga にセットして、プロセスは終了する。しかし、子プロセスの環境変数は親プロセスに影響しないため、親プロセスであるシェルの環境変数は全く変化しない。
これでは全く意味がないため、シェルのプロセス自身の情報を変更するコマンドは、シェルの内部コマンドとして用意されているわけである。