子プロセスのゾンビ化
これらのシステムコールはいずれも、呼び出し元プロセスの子プロセスの 状態変化を待ち、状態が変化したその子プロセスの情報を取得するのに使用される。状態変化とは以下のいずれかである:子プロセスの終了、シグナルによる子プロセスの停止、 シグナルによる子プロセスの再開。 子プロセスが終了した場合は、wait を実行することで、 システムがその子プロセスに関連するリソースを解放
できるようになる。 wait が実行されなかった場合には、終了した子プロセスは 「ゾンビ」状態
で残り続ける (下記の注意の章を参照のこと)。
...
終了したが、wait されていない子プロセスは「ゾンビ」になる。 後で親プロセスが wait を実行して子プロセスについての情報を取得できるように、 カーネルはゾンビプロセスについて最小限の情報 (PID、終了ステータス、 リソース使用状況) を保持
する。 ゾンビプロセスは、waitによってシステムから削除されない限り、 カーネルのプロセステーブルの1エントリーを消費する。このプロセステーブルが 一杯になると、新たにプロセスを作ることができなくなる
。 親プロセスが終了すると、その親プロセスの「ゾンビ」の 子プロセスは (もしあれば)init(1)の養子となる。init(1)はwaitを自動的に実行し、ゾンビを削除
する。
出典
シグナル
プロセスは基本的には一本の実行の流れ
に沿ってひたすら実行し続けます。
...
シグナルとはあるプロセスに何かを通知して、外部から実行の流れを強制的に変える
ための仕組みです。
...
一番多用されているのはなんといってもSIGINTでしょう。このシグナルはbashなどのシェルにおいてCtrl+C
と打つと送られるものです。
...
シグナルはbash以外からもkillコマンドによって送られます。
...
シグナルの一覧はman 7 signal
コマンドを実行すれば見られます。
...
プロセスは各シグナルについて、シグナルハンドラという処理をあらかじめ登録
しておけます。
出典
シグナルの実験
root@linuxstructure2:/home/vboxuser/study# cat intignore.py
#!/usr/bin/python3
import signal
signal.signal(signal.SIGINT, signal.SIG_IGN)
while True:
pass
出典
root@**********:**************# python3 intignore.py
^C^C^C^C^C^C^C^C^C^C^C^Z
[1]+ 停止 python3 intignore.py
root@**************:**************# python3 intignore.py &
[2] 3070
root@**************:**************# kill 3070
気づき
確かにCtrl+C
を押しても終了できなかった。
しかし他のCtrl+Z
を押したら一時停止したからすごい
ソースコードの意味はまた後で