ふつうのlinux 2
ふつうのlinuxを読んでるシリーズ。その2
聞いたことがない用語や、理解があやふやな用語をメモしておく。
ハードリンク
ファイルの「名前」は、パスである。ファイルには、複数の名前=パスを付けることができる(i.e. ハードリンクによって、同じファイルに複数のパスでアクセスできるようになる)。ファイルに何個の名前がついているか、をリンクカウントと呼ぶ。rmでファイルを消している、ように見えるが、実際にはリンクカウントを減らしている。本当に消えるのは、リンクカウントが0になるとき。リンクカウントは、ls -l
の表示で、pemissionの次の列に見える。
ダイナミックロード
ダイナミックリンクでは、実行ファイルのリンク時に、ライブラリと関数を指定だけする。実際にリンクされるのは実行時。ダイナミックロードは、さらに動的で、ライブラリ名や関数名も実行時に指定する。Pythonの拡張ライブラリなどは、この仕組みを使っているらしい。これなら、Python自体のビルド時には、ライブラリや関数名が要らない。
ゾンビ
親プロセスは、子プロセスをfork
したあとにwait
によってステータスコードを得ることができる。
ここで、親プロセスがfork
したあとにwait
を呼ばないで放っておいたとする。カーネルからすると、親プロセスがfork
を未来永劫呼ばないのか、まだ読んでないだけなのか、が分からない。よって、カーネルは親プロセスがwait
するまで子プロセスのステータスコードを保存している。この状態の子プロセスをゾンビと呼ぶ。ゾンビが増えすぎるのは、ある種のリソースリークなので、基本的には親プロセスがwait
をするのが行儀が良い。
これをサボる方法として、fork
を2段階で行う方法がある。
- 親プロセスが子プロセスを
fork
- 子プロセスが孫プロセスを
fork
- 子プロセスは
fork
後に、直ちにexit
ポイントは、「あるプロセスのステータスコードをwait
できるのは、直接の親プロセスだけ」ということ。上の例では子プロセスがすぐにexit
して消えているので、孫プロセスのステータスコードを読める者がいなくなっている。よってカーネルは安心して孫プロセスのステータスコードを捨てることができる。
プロセスグループとセッション
シェルから、パイプで複数のプロセスをつないで実行し、それがある程度の時間、生きているとする。この時、Ctrl + Cでシグナルを送ると、つながったプロセスが全部、停止する。このように、複数のプロセスにまとめてシグナルを送るためにプロセスをグループ化する機能があって、まさにプロセスグループと呼ぶ。
さらに、ユーザーのログインからログアウトまでのプロセスグループをまとめたのをセッションと呼ぶ。
set-uid
実行ユーザーに関係なく、決まったユーザーとして実行されるファイルがある。ls -l
したときに、オーナーの実行可能フラグがx
ではなくs
で表示される。
netstat
netstat --tcp --listen
で、listen
しているプロセスとポートの組が見れる。
inetd
指定されたポートでlisten
する。接続が来たら、そのソケットを標準入出力につないで、設定されたプログラムをexec
する。
この仕組みを使うと、標準入出力でやり取りするプログラムだけつくれば、TCPの上で外部とやり取りするサーバーができる。