forkを用いたプロセスのフォーキングについて。
fork
- forkをコールするとforkをコールしたプロセスの複製(子プロセス)が生成され、子プロセスはforkした部分から処理が継続する。
- このとき、親プロセス側ではforkの戻り値として生成した子プロセスのプロセスID、子プロセス側では0が返却される(この戻り値を元に、プロセス自身がforkした親プロセスかforkされた子プロセスか判断し、処理を振り分ける)。
- (子プロセスを生成するためのメモリが不足している等の原因により)子プロセスの生成に失敗した場合は、-1が返される。
- 子プロセスを生成する際、親プロセスで開いているファイルディスクリプタは子プロセスにコピーされる。
- forkされた後、子プロセスではforkされたスレッドのみしか存在しない状態になるためシングルスレッドで起動するが、mutexの状態などのpthreadオブジェクトは親プロセスのものがコピーされる。
- 親プロセスのメモリロック、タイマー、非同期I/O、処理待ちのシグナルなどはコピーされない。
exit
- exitは、コールされたあとプロセスで使用していたリソースを解放しようとする。 exitを使って終了すると、親プロセスからコピーされたリソース(前述)を解放しようとする。
- 親プロセスと共有しているリソースがある状態で子プロセスでexitすると、親プロセスがそのリソースを使用しているか否かに関わらず、リソースを解放してしまう。
- exitに対して、_exitはリソースを解放せずに即時にプロセスを終了する(そのプロセスで開いたファイルディスクリプタは閉じられる)。
wait
- waitをコールすると、forkした子プロセスのいずれかが終了するまで待機する(このとき、waitをコールしたプロセスは実行が一時停止する)。
- waitpidは、子プロセスの状態が変わった時点で実行が復帰する。
- waitpidの第3パラメータにWNOHANGを指定すると、子プロセスの状態が変わっていなければ、即座に復帰する。
- 第1パラメータに任意のプロセスIDを指定すると、プロセスIDに等しい子プロセスについて状態の変化を監視する。 -1を指定すると、子プロセスのいずれかの状態の変化を監視する。