子プロセスを複数生成して、それぞれの子プロセスからデータを渡すにはどうしたらよいのでしょう?
また、子プロセスでは親プロセスの値を参照できるのでしょうか?
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
explorer.exeが異様にメモリを食う
-
プロセスのアタッチ・デタッチ...
-
Texについてです。 jpgファイル...
-
WINのタスクマネージャの強制終了
-
シェルで親プロセス終了時に子...
-
ウィンドウのタイトルからプロ...
-
Linuxでのスレッド間メッセージ...
-
C++のプログラムをバックグラウ...
-
他のアプリケーションの操作に...
-
API関数 GetExitCodeProcess
-
怪しいプロセス教えてください。
-
WebBrowserでPDF表示でのトラブル
-
Windowsでのfork方法
-
ADOでアクセスのレコードに...
-
Visual C++からpingを実行して...
-
VBでエクセルを起動し、プロ...
-
スレッド?
-
VB6.0 SHELLで起動...
-
複数同時実行時の参照先について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
explorer.exeが異様にメモリを食う
-
なぜ女性は男性が忘れたことを...
-
タスクマネージャーのプロセス...
-
プロセスのアタッチ・デタッチ...
-
非表示になったエクセルは?
-
Process.Startの戻り値を後で取得
-
C#でのbatファイル実行結果取得
-
プロセスIDからウィンドウハ...
-
c言語でプロセスIDを調べたい
-
Linuxでのスレッド間メッセージ...
-
プロセスIDの取得方法について
-
ADOでアクセスのレコードに...
-
怪しいプロセス教えてください。
-
vb.netでEXCEL起動がうまくでき...
-
別のプロセスの関数を呼び出す...
-
C++のプログラムをバックグラウ...
-
Visual C++からpingを実行して...
-
VBS(WSH)で開いたIEのウィンド...
-
IISがフリーズ
おすすめ情報