子プロセスを複数生成して、それぞれの子プロセスからデータを渡すにはどうしたらよいのでしょう?
また、子プロセスでは親プロセスの値を参照できるのでしょうか?
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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
プロセスIDの取得方法について
-
Visual C++からpingを実行して...
-
怪しいプロセス教えてください。
-
他のコンピュータのプロセスを取得
-
OSPFでプロセスを分ける意義に...
-
Process.Startの戻り値を後で取得
-
Windowsのユーザログイン/ログ...
-
タスクマネージャーのプロセス...
-
C言語のプログラムにて二つの処...
-
プロセスのアタッチ・デタッチ...
-
別のプロセスの関数を呼び出す...
-
C言語 特定のプロセスの終了を...
-
sleep関数の精度について
-
explorer.exeが異様にメモリを食う
-
起動しているプロセスの確認
-
AppActivate関数について
-
他のEXEが起動しているかの確認
-
タスクマネージャーのプロセス...
-
API関数 GetExitCodeProcess
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
C#でのbatファイル実行結果取得
-
explorer.exeが異様にメモリを食う
-
プロセスのアタッチ・デタッチ...
-
タスクマネージャーのプロセス...
-
怪しいプロセス教えてください。
-
非表示になったエクセルは?
-
Process.Startの戻り値を後で取得
-
ADOでアクセスのレコードに...
-
Windowsでのfork方法
-
プロセスIDからウィンドウハ...
-
他のコンピュータのプロセスを取得
-
SendMessageが失敗するときがある
-
プロセスが実行中かどうか調べ...
-
IISがフリーズ
-
ロードアベレージが高いのです...
-
プロセスIDの取得方法について
-
OSPFでプロセスを分ける意義に...
-
API関数 GetExitCodeProcess
-
別のプロセスの関数を呼び出す...
おすすめ情報