- ベストアンサー
forkとグローバル変数について
上記タイトルについて質問です。 グローバル変数で定義した変数(int型) をforkで作成した子プロセス間で使用したいのですがうまくいきません。実際には以下のように定義しています。 int flg=0; main() { if(( i=fork() )==0){ flg = 1; /* こっちをA */ } else { sleep(3); printf(" flg=%d\n", flg ); /* こっちをB */ } } こういった使い方は間違いなのでしょうか? また、上記にてA側で変更したグローバル変数の値をB側でも使用することが出来る方法を教えて下さい。(グローバル変数以外でも同様の処理が行えればそれでもいいので教えて下さい。)
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
すでに回答にあるとおりできません. プロセス間で同じ変数を使う場合は共有メモリを使えば可能です。 多分、現在のunix系のOSならどれでも使えるだろうとは思います。 shmget, shmctl, shmat, shmdtあたりを調べてみてください。 ただ、こういうのを使う場合は、いろいろと注意が必要です。 パイプはプロセス間でデータをやりとりするために、 太古(?)のunixからある機能ですが、 共有とはちがいますね。 これはあるプロセスがwriteしたデータを別なプロセスがreadできるというだけです。
その他の回答 (2)
- asuca
- ベストアンサー率47% (11786/24626)
この場合 int flgをグローバルで取っている限りだめで静的に static int flgなどにしないとやはりだめですね。 グローバルで取った場合それぞれのプロセスが独自のエリアを使ってしまうために他のプロセスでそれを反映させることが出来ないんです。 forkを使った段階でプロセスは自分自身のコピーを作り出しますのメモリ領域もコピーされる段階での物は使えますが動的に取ったものでは他のプロセスには反映されません。逆にそれが助かる場合もあるんですがね。
- haporun
- ベストアンサー率40% (230/562)
forkでプロセスが分岐したあとは、変数を変更してもそれぞれのコピーを変更するだけなので、双方に影響を及ぼしません。 これはforkが作るのがスレッドではなくプロセスであるからです。 UNIXのCについてはあまりよく知らないのですが、プロセス間でデータを共有するにはパイプを使う必要があります。 んんん、ほかに何かいい方法があるかもしれないので、締め切らずに待ってみてください。
お礼
そうですか。やっぱり使えないんですね。(ちょっとがっかりです) パイプについて少し調べてみたいと思います。 ありがとうございました。もう少し待ってみたいと思います。
お礼
共有メモリですか。確かにそうですね。 共有メモリ上に展開されていれば使用できそうですね。 ありがとうございます。やってみます。