RubyでUnixプロセスを活用する

なるほどUnixプロセスを読みました。
RubyUnixプロセスを活用する」という観点から、学んだ事をまとめようと思います。

子プロセスを生成する

Kernel.fork

実行中のプロセスから新しいプロセスを生成できる。
子プロセスは親プロセスで使われているすべてのメモリのコピーを引き継ぐ。親プロセスが開いているファイルディスクリプタも同様に引き継ぐ。
CoW(Copy on Write)の仕組みを採用すれば、書き込みが必要になるまでメモリを実際にコピーするのを遅らせることができ、リソースを節約できる。

プロセス間で情報伝達させる

Process.wait系

子プロセスが1つ終了するまでの間、親プロセスをブロックして待つ。
対象の子プロセスの指定可否(◯:指定できる、×:指定できない)と戻り値は下記の通り。

指定可否 戻り値
Process.wait × 終了した子プロセスのpid
Process.wait2 × 終了した子プロセスのpid, 終了ステータス
Process.waitpid 終了した子プロセスのpid
Process.waitpid2 終了した子プロセスのpid, 終了ステータス

Process.kill

pidで指定されたプロセスに、シグナルを送信する。
シグナルの一覧は下記の通り。

シグナル 番号 アクション(※) 説明
SIGHUP 1 Term 制御端末のハングアップ検出、
または制御しているプロセスの死
SIGINT 2 Term キーボードからの割り込み
SIGQUIT 3 Core キーボードによる中止
SIGILL 4 Core 不正な命令
SIGABRT 6 Core abort(3)からの中断シグナル
SIGFPE 8 Core 浮動小数点例外
SIGKILL 9 Term Kill シグナル
SIGSEGV 11 Core 不正なメモリ参照
SIGPIPE 13 Term パイプ破壊:読み手の無いパイプへの書き出し
SIGALRM 14 Term alarm(2)からのタイマーシグナル
SIGTERM 15 Term 終了シグナル
SIGUSR1 30, 10, 16 Term ユーザ定義シグナル1
SIGUSR2 31, 12, 17 Term ユーザ定義シグナル2
SIGCHLD 20, 17, 18 Ign 子プロセスの一時停止または終了
SIGCONT 19, 18, 25 Cont 一時停止からの再開
SIGSTOP 17, 19, 23 Stop プロセスの一時停止
SIGTSTP 18, 20, 24 Stop 端末より入力された一時停止
SIGTTIN 21, 21, 26 Stop バックグラウンドプロセスの端末入力
SIGTTOU 22, 22, 27 Stop バックグラウンドプロセスの端末出力

(※)アクションは、各シグナルのデフォルト処理を表している。凡例は以下の通り。

Term プロセスをすぐに終了させる
Core プロセスをすぐに終了させ、コアをダンプする
Ign プロセスはシグナルを無視する
Stop プロセスを停止させる
Cont プロセスを復帰させる

IO.pipe

プロセス間にデータ(ストリーム)を流すためのパイプを作る。
戻り値は、2つのIOオブジェクト(読み込み用・書き込み用)を要素とする配列。
データの流れは単方向。

Socket.pair

プロセス間にデータ(データグラム)を流すためのソケットを作る。
戻り値は、既に互いが接続されたUnix ソケットのペアを含む配列。
データの流れは双方向。

所感

これまでは、プロセスをあまり意識せずにプログラミングをしてきていました。
今回の読書の過程で、実際にプロセスを生成してみたり、プロセス間での通信を行ってみたりすることで、プロセスを体感することができました。
今後は、「Unixのパワーをより発揮するにはどうすればよいか?」という課題も意識しつつ、開発に取り組んでいきたいと思います。

なるほどUnixプロセス ― Rubyで学ぶUnixの基礎
Jesse Storimer, 島田浩二(翻訳), 角谷信太郎(翻訳)
達人出版会
発行日: 2013-04-25
対応フォーマット: EPUB, PDF, ZIP