例題では、親プロセスから生成された子プロセスは、親プロセスが持っていたメモリ(変数)をコピーし情報のやりとりを行っています。
その際、親・子プロセス両方から読み書き可能なメモリ領域を作って情報をやりとりする必要があります。
それを実現するのが共有メモリです。
共有メモリの取得後、削除せずに終了した場合、その共用メモリはOSが終了するまで残ってしまいます。
このようなメモリはipcsコマンドで見ることができ、ipcrmにより削除することが可能です。
(共有メモリを利用するプログラム起動中に ipcrm を行うと、release_sharemem 関数にて、"shmctl: Invalid argument" というようなエラーメッセージが表示されます。その辺はきちんと排他制御的なコードを考える必要はあります:セマフォ等)
今回の例題では a(int型)のデータのみ共用していますが、共有する情報は構造体にまとめて共有するのが便利であるため、共有メモリは構造体として宣言しています。
例題の動作は、親プロセスにより子プロセスが終了するのを待ち、a が 0 でなければプログラムを終了し、メモリを削除、a が 0 であれば、再びプロセスを作成し同じ処理を続行するようになっています。
例題に用いた関数は以下のもの。
shmget() 共有メモリの識別子を得る
shmat() 自プロセスのメモリとして割り当てる
shmdt() 自プロセスのメモリから外す
shmctl() 共有メモリの制御を行う(共有メモリの削除も可能)
子プロセスが起動した状態をアクティビティモニタにより確認した様子:
(Path Finder から tcsh を起動し、その後 make でソースをコンパイル・実行しているので、list_xxx のコマンドがそれ以降の階層に表示されており、さらに子プロセスが起動しているのが分かります。)
共有メモリを削除し忘れた場合の削除方法
実行結果
0 件のコメント:
コメントを投稿