less than 1 minute read

ふつうのlinuxを読んでるシリーズ。その2

聞いたことがない用語や、理解があやふやな用語をメモしておく。

ハードリンク

ファイルの「名前」は、パスである。ファイルには、複数の名前=パスを付けることができる(i.e. ハードリンクによって、同じファイルに複数のパスでアクセスできるようになる)。ファイルに何個の名前がついているか、をリンクカウントと呼ぶ。rmでファイルを消している、ように見えるが、実際にはリンクカウントを減らしている。本当に消えるのは、リンクカウントが0になるとき。リンクカウントは、ls -lの表示で、pemissionの次の列に見える。

ダイナミックロード

ダイナミックリンクでは、実行ファイルのリンク時に、ライブラリと関数を指定だけする。実際にリンクされるのは実行時。ダイナミックロードは、さらに動的で、ライブラリ名や関数名も実行時に指定する。Pythonの拡張ライブラリなどは、この仕組みを使っているらしい。これなら、Python自体のビルド時には、ライブラリや関数名が要らない。

ゾンビ

親プロセスは、子プロセスをforkしたあとにwaitによってステータスコードを得ることができる。

ここで、親プロセスがforkしたあとにwaitを呼ばないで放っておいたとする。カーネルからすると、親プロセスがforkを未来永劫呼ばないのか、まだ読んでないだけなのか、が分からない。よって、カーネルは親プロセスがwaitするまで子プロセスのステータスコードを保存している。この状態の子プロセスをゾンビと呼ぶ。ゾンビが増えすぎるのは、ある種のリソースリークなので、基本的には親プロセスがwaitをするのが行儀が良い。

これをサボる方法として、forkを2段階で行う方法がある。

  1. 親プロセスが子プロセスをfork
  2. 子プロセスが孫プロセスをfork
  3. 子プロセスはfork後に、直ちにexit

ポイントは、「あるプロセスのステータスコードをwaitできるのは、直接の親プロセスだけ」ということ。上の例では子プロセスがすぐにexitして消えているので、孫プロセスのステータスコードを読める者がいなくなっている。よってカーネルは安心して孫プロセスのステータスコードを捨てることができる。

プロセスグループとセッション

シェルから、パイプで複数のプロセスをつないで実行し、それがある程度の時間、生きているとする。この時、Ctrl + Cでシグナルを送ると、つながったプロセスが全部、停止する。このように、複数のプロセスにまとめてシグナルを送るためにプロセスをグループ化する機能があって、まさにプロセスグループと呼ぶ。

さらに、ユーザーのログインからログアウトまでのプロセスグループをまとめたのをセッションと呼ぶ。

set-uid

実行ユーザーに関係なく、決まったユーザーとして実行されるファイルがある。ls -lしたときに、オーナーの実行可能フラグがxではなくsで表示される。

netstat

netstat --tcp --listen で、listenしているプロセスとポートの組が見れる。

inetd

指定されたポートでlistenする。接続が来たら、そのソケットを標準入出力につないで、設定されたプログラムをexecする。

この仕組みを使うと、標準入出力でやり取りするプログラムだけつくれば、TCPの上で外部とやり取りするサーバーができる。

タグ: ,

カテゴリー:

更新日時: