No.470
屋外で開催される成人式関連のイベントで電源出しです。
起動してしまえばやることはありません。
本日の課題は共有メモリのテストです。
次のページにあるソースをそのまま使って挙動を確認です。
プロセス間でのメモリ共有
親プロセス「ShareMemTest1」を起動した後、待機時間(20秒)のうちにコンソールで「ShareMemTest2」に共有メモリのIDを与えて起動するというもの。一貫したプログラムではありませんが、やりたいことはプロセス間でのメモリ共有ですからむしろわかりやすい。
ちなみに、コンソールでプログラムを起動する際、末尾に「&」を付けると新規プロセスで実行します。
ここサンプルを使うなら、
<親プロセスを起動>
$ ./ShareMemTest1 &
<起動後表示>
nShareMemID = 23 /* IDは都度変わります */
process1 : nVar1 = 1, nVar2 = 2
・・・ここで20秒Sleepしてます・・・
<子プロセスを起動>
$ ./ShareMemTest2 23 &
<起動後表示>
nShareMemID = 23
process2 : nVar1 = 1, nVar2 = 2
process2 : nVar1 = 2, nVar2 = 2
・・・子プロセスはここで終了・・・
・・・20秒後、親プロセスが再開・・・
process2 : nVar1 = 2, nVar2 = 2
・・・親プロセスも終了・・・
となります。
正に記述にある通り。
$ ipcs -m
や
$ free
を用いるとSharedメモリの状況がわかります。
実際のテストではgetpid()を用いてプロセスIDも表示しながら確認しましたが、確かに別プロセスでした。
共有メモリの容量は、無意味に8MBくらい設定してみましたが何の問題も無し。
親側の設定は、typedefで構造体を定義し、構造体のポインタ変数を作り、構造体のメモリサイズ(sizeof()で取得)をもとに共有メモリを作り、構造体のポインタ変数に共有メモリを割り当てる、といった流れでしょうか。
子側は、typedefで構造体を定義し、構造体のポインタ変数を作り、親から取得したIDから構造体のポインタ変数に共有メモリを割り当てる、といった流れ?
共有メモリ上に変数(構造体)を構築した後は共有メモリを意識する必要は無いと思います。もちろん、衝突回避は常に考えないといけませんけど。
勘違いしていた点ですが、共有メモリのIDは管理用の通し番号であってポインタに設定するアドレスではないことです。C言語では何かにつけてポインタ渡しなのでこれもそうかと思ってしまいました。
共有メモリに構造体を配置することが次の課題ですが、構造体についてもう少し勉強してからです。
#C言語
起動してしまえばやることはありません。
本日の課題は共有メモリのテストです。
次のページにあるソースをそのまま使って挙動を確認です。
プロセス間でのメモリ共有
親プロセス「ShareMemTest1」を起動した後、待機時間(20秒)のうちにコンソールで「ShareMemTest2」に共有メモリのIDを与えて起動するというもの。一貫したプログラムではありませんが、やりたいことはプロセス間でのメモリ共有ですからむしろわかりやすい。
ちなみに、コンソールでプログラムを起動する際、末尾に「&」を付けると新規プロセスで実行します。
ここサンプルを使うなら、
<親プロセスを起動>
$ ./ShareMemTest1 &
<起動後表示>
nShareMemID = 23 /* IDは都度変わります */
process1 : nVar1 = 1, nVar2 = 2
・・・ここで20秒Sleepしてます・・・
<子プロセスを起動>
$ ./ShareMemTest2 23 &
<起動後表示>
nShareMemID = 23
process2 : nVar1 = 1, nVar2 = 2
process2 : nVar1 = 2, nVar2 = 2
・・・子プロセスはここで終了・・・
・・・20秒後、親プロセスが再開・・・
process2 : nVar1 = 2, nVar2 = 2
・・・親プロセスも終了・・・
となります。
正に記述にある通り。
$ ipcs -m
や
$ free
を用いるとSharedメモリの状況がわかります。
実際のテストではgetpid()を用いてプロセスIDも表示しながら確認しましたが、確かに別プロセスでした。
共有メモリの容量は、無意味に8MBくらい設定してみましたが何の問題も無し。
親側の設定は、typedefで構造体を定義し、構造体のポインタ変数を作り、構造体のメモリサイズ(sizeof()で取得)をもとに共有メモリを作り、構造体のポインタ変数に共有メモリを割り当てる、といった流れでしょうか。
子側は、typedefで構造体を定義し、構造体のポインタ変数を作り、親から取得したIDから構造体のポインタ変数に共有メモリを割り当てる、といった流れ?
共有メモリ上に変数(構造体)を構築した後は共有メモリを意識する必要は無いと思います。もちろん、衝突回避は常に考えないといけませんけど。
勘違いしていた点ですが、共有メモリのIDは管理用の通し番号であってポインタに設定するアドレスではないことです。C言語では何かにつけてポインタ渡しなのでこれもそうかと思ってしまいました。
共有メモリに構造体を配置することが次の課題ですが、構造体についてもう少し勉強してからです。
#C言語