
子プロセスを複数生成して、それぞれの子プロセスからデータを渡すにはどうしたらよいのでしょう?
また、子プロセスでは親プロセスの値を参照できるのでしょうか?
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);
}
}
また、もしこのコードが不正であればよい方法をご教授お願いします。
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)あたりを調べてください。
ただし、共有メモリは同期の問題が出ますからご注意を。
ご回答ありがとうございます。
fork()以前の値の参照は問題ない、親からの子の値の参照は無効ということが理解できました。勉強になりました。共有メモリについても勉強したいと思います。
No.2
- 回答日時:
上記のstrのような変数はプロセス毎に作成されるはずです。
読み書きは自プロセスのものに対して行われるので危険ではありませんが、親プロセスの変数に書きこむことはできません。
環境で用意されたプロセス間通信の方法を使うことになると思います。
この回答への補足
ご回答ありがとうございます。
ということは子プロセス内からstrを参照したときに値は"hoge"が取得されるのでしょうか?また、仮にfork処理前にstrcpy(str, "abcd1234");とした場合にも"abcd1234"が取得されるのでしょうか?
fork()が呼び出された時点からプロセスが分かれ、それ以前の変数などの値は受け継いでいるのでしょうか?
No.1
- 回答日時:
違うプロセスの間でデータを共有するには、共有メモリを使ってデータを共有するか、ソケットで通信するしかありません。
この回答への補足
早速のご回答ありがとうございます。共有メモリかソケットで通信するとのことですが、以下のサイトでは
http://www.ncad.co.jp/~komata/c-kouza10.htm
親プロセスで生成したソケットを子プロセスでクローズしたり、また親プロセスで生成した他のソケットを使って通信をしているようです。子プロセスで親プロセスからのソケットを参照していますが、このソケットは共有メモリを使用していたり、ソケット通信で参照していませんがどのようになっているのでしょう?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
フレームワークとプロセスの違...
-
プロセスIDからウィンドウハ...
-
GPLによるソース公開の回避方法
-
_fcloseall
-
IISがフリーズ
-
プロセスはファイルにアクセス...
-
シェルで親プロセス終了時に子...
-
ウインドウのプロセス終了について
-
バッチファイルでPINGログ取得
-
WSH.Runで待機できません
-
vb.netでEXCEL起動がうまくでき...
-
services.exeが延々と。
-
explorer.exeが異様にメモリを食う
-
プロセスIDの取得方法について
-
共有メモリの使い方について
-
常駐するアプリケーションを初...
-
プロセスのアタッチ・デタッチ...
-
ADOでアクセスのレコードに...
-
CreateObjectで作成したExcelの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
VB6.0 SHELLで起動...
-
プロセスIDの取得方法について
-
C#でのbatファイル実行結果取得
-
タスクマネージャーのプロセス...
-
プロセスのアタッチ・デタッチ...
-
vb.netでEXCEL起動がうまくでき...
-
SendMessageが失敗するときがある
-
ADOでアクセスのレコードに...
-
非表示になったエクセルは?
-
explorer.exeが異様にメモリを食う
-
怪しいプロセス教えてください。
-
Process.Startの戻り値を後で取得
-
プロセスIDからウィンドウハ...
-
Linuxでのスレッド間メッセージ...
-
警告『 別のプロセスで使用され...
-
Visual C++からpingを実行して...
-
WSH.Runで待機できません
-
c言語でプロセスIDを調べたい
-
API関数 GetExitCodeProcess
おすすめ情報