• ベストアンサー

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側でも使用することが出来る方法を教えて下さい。(グローバル変数以外でも同様の処理が行えればそれでもいいので教えて下さい。)

質問者が選んだベストアンサー

  • ベストアンサー
  • terra5
  • ベストアンサー率34% (574/1662)
回答No.3

すでに回答にあるとおりできません. プロセス間で同じ変数を使う場合は共有メモリを使えば可能です。 多分、現在のunix系のOSならどれでも使えるだろうとは思います。 shmget, shmctl, shmat, shmdtあたりを調べてみてください。 ただ、こういうのを使う場合は、いろいろと注意が必要です。 パイプはプロセス間でデータをやりとりするために、 太古(?)のunixからある機能ですが、 共有とはちがいますね。 これはあるプロセスがwriteしたデータを別なプロセスがreadできるというだけです。

badbeat
質問者

お礼

共有メモリですか。確かにそうですね。 共有メモリ上に展開されていれば使用できそうですね。 ありがとうございます。やってみます。

その他の回答 (2)

  • asuca
  • ベストアンサー率47% (11786/24626)
回答No.2

この場合 int flgをグローバルで取っている限りだめで静的に static int flgなどにしないとやはりだめですね。 グローバルで取った場合それぞれのプロセスが独自のエリアを使ってしまうために他のプロセスでそれを反映させることが出来ないんです。 forkを使った段階でプロセスは自分自身のコピーを作り出しますのメモリ領域もコピーされる段階での物は使えますが動的に取ったものでは他のプロセスには反映されません。逆にそれが助かる場合もあるんですがね。

  • haporun
  • ベストアンサー率40% (230/562)
回答No.1

forkでプロセスが分岐したあとは、変数を変更してもそれぞれのコピーを変更するだけなので、双方に影響を及ぼしません。 これはforkが作るのがスレッドではなくプロセスであるからです。 UNIXのCについてはあまりよく知らないのですが、プロセス間でデータを共有するにはパイプを使う必要があります。 んんん、ほかに何かいい方法があるかもしれないので、締め切らずに待ってみてください。

badbeat
質問者

お礼

そうですか。やっぱり使えないんですね。(ちょっとがっかりです) パイプについて少し調べてみたいと思います。 ありがとうございました。もう少し待ってみたいと思います。

関連するQ&A