• ベストアンサー

親子プロセス間でのデータの受け渡しについて

子プロセスを複数生成して、それぞれの子プロセスからデータを渡すにはどうしたらよいのでしょう? また、子プロセスでは親プロセスの値を参照できるのでしょうか? char str[] = "hoge"; int dec[10]; dec[0] = 0; . . . dec[9] = 0; for(i = 0; i < 10; i++) { if((gid = fork()) == 0) { printf("%s\n", str);/* 危険でないか? */ dec[i] = i;/* 親プロセスで有効になるか */ exit(EXIT_SUCCESS); } else if(gid == -1) { perror("fork"); exit(EXIT_FAILURE); } } また、もしこのコードが不正であればよい方法をご教授お願いします。

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

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

fork()はunix系のOSのシステムコールですから、unix系のOSとして話します。 プロセス毎にメモリ空間は独立しているため、 全く同じデータを使うなら共有メモリを使いますし、 それ以外はソケット、パイプ、メッセージ等によりプロセス間通信を行いデータをやり取りすることになります。 >http://www.ncad.co.jp/~komata/c-kouza10.htm それはプロセス間通信のソケットの話ではありません。 子プロセスがTCP/IPで通信しているだけです。 >fork()が呼び出された時点からプロセスが分かれ、それ以前の変数などの値は受け継いでいるのでしょうか? はい。fork以前の値の参照は問題ありません。 fork()の変数の値が全てコピーされます。 >strcpy(str, "abcd1234"); これはfork以前にバッファオーバーフローのバグですが。 strは5バイトです。 > dec[i] = i;/* 親プロセスで有効になるか */ なりません。親プロセスでは値は変化しません。 このような書き方で使いたい場合は共有メモリを使います。 char *dec;の形で宣言し、decに共有メモリから確保した領域のアドレスを入れて使います。 詳しくはshmat(2), shmctl(2), shmget(2), shmdt(2)あたりを調べてください。 ただし、共有メモリは同期の問題が出ますからご注意を。

negi-bozu
質問者

お礼

ご回答ありがとうございます。 fork()以前の値の参照は問題ない、親からの子の値の参照は無効ということが理解できました。勉強になりました。共有メモリについても勉強したいと思います。

その他の回答 (2)

  • kmb01
  • ベストアンサー率45% (63/138)
回答No.2

上記のstrのような変数はプロセス毎に作成されるはずです。 読み書きは自プロセスのものに対して行われるので危険ではありませんが、親プロセスの変数に書きこむことはできません。 環境で用意されたプロセス間通信の方法を使うことになると思います。

negi-bozu
質問者

補足

ご回答ありがとうございます。 ということは子プロセス内からstrを参照したときに値は"hoge"が取得されるのでしょうか?また、仮にfork処理前にstrcpy(str, "abcd1234");とした場合にも"abcd1234"が取得されるのでしょうか? fork()が呼び出された時点からプロセスが分かれ、それ以前の変数などの値は受け継いでいるのでしょうか?

  • abayama
  • ベストアンサー率48% (38/79)
回答No.1

違うプロセスの間でデータを共有するには、共有メモリを使ってデータを共有するか、ソケットで通信するしかありません。

negi-bozu
質問者

補足

早速のご回答ありがとうございます。共有メモリかソケットで通信するとのことですが、以下のサイトでは http://www.ncad.co.jp/~komata/c-kouza10.htm 親プロセスで生成したソケットを子プロセスでクローズしたり、また親プロセスで生成した他のソケットを使って通信をしているようです。子プロセスで親プロセスからのソケットを参照していますが、このソケットは共有メモリを使用していたり、ソケット通信で参照していませんがどのようになっているのでしょう?

関連するQ&A