質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

Q&A

解決済

2回答

3815閲覧

プロセス親子間でのメモリ共有

退会済みユーザー

退会済みユーザー

総合スコア0

OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

0グッド

0クリップ

投稿2017/02/07 06:24

編集2017/02/07 08:48

linux プロセスの親子間でのメモリ共有がされないことを示したいです。
forkによるプロセス生成のプログラムを用いて考えてみたのですが考え方が間違っていましたら
ご助言願えませんでしょうか。

<考え方>
まず、x=10であるとします。
この時点で子プロセスと親プロセスにはx=10が入っています。
そして子プロセスの処理として印字し、子プロセス内x=10であることを確認します。
次に親プロセスの処理としてx=100とします。
もし、親子間でプロセスの共有がされていたならば、この時点で子プロセスでもx=10
となっているはずです。
処理後にxを印字します。ここでx=10のままであるため、プロセスの親子間でメモリの共有がされていないことを示せる、と考えました。

どうぞよろしくお願いいたします。

#include<stdio.h>
int main(int argc, char*argc[])
{
int val,x;
x=10;
switch(fork()){
case 0:
printf("%d",x);
exit(0);
case -1;
perror("child process");
break;
default:
x=100;
wait(&val);
}
printf("%d",x);
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/02/07 08:42

aはxです。失礼いたしました。
guest

回答2

0

ベストアンサー

こんにちは。

処理後にaを印字します。ここでa=10のままであるため、プロセスの親子間でメモリの共有がされていないことを示す。

これは子プロセス側の処理と思います。
この処理で共有していないことを示すには、親プロセスがx=100;を実行した後に子プロセス側でxを印字する必要がありますが、その待ちと印字処理がないようです。

子プロセスが親プロセスのなんらかの処理を待つこともできますが、結構面倒です。
子プロセスで行った修正が親プロセスで共有されていないことを確認する方が簡単ですよ。

投稿2017/02/07 06:37

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/02/07 08:58

chironianさん、こんにちは。 ご回答ありがとうございます。 まず、プログラムに間違えて変数aを記載しておりましたが全てxです。 修正させていただきました。 〉子プロセスで行った修正が親プロセスで反映されていないことを示す。 なるほど、どちらを修正しても良いと思い込んでいました。 このアドバイスを受けて再度作ってみました。 int main(int argc, char*argc[]) { int val,x; x=10; switch(fork()){ case 0: x=100;\*子プロセスにて修正*\ exit(0); case -1; perror("child process"); break; default: printf("%d",x);/*親プロセスにて印字*/ wait(&val); } printf("%d",x); \*子プロセスにて印字*\ }
Chironian

2017/02/07 09:10

考え方は良いと思うのですか、微妙に違っているようです。 exit(0);で子プロセスが終了しますので、printf("%d",x); \*子プロセスにて印字*\は子プロセスでは実行されません。 printf("%d",x);/*親プロセスにて印字*/・・・① wait(&val); ・・・② } printf("%d",x); \*子プロセスにて印字*\・・・③ 親プロセスでの動作は以下の通りです。 ①xを表示 ②子プロセスの終了を待つ ③xを表示→ここで子プロセスでの修正が反映されないことを確認ですね。
guest

0

chironianさん、
ありがとうございました!

考え方の間違いを指摘していただき、とてもわかり易かったです。

それぞれの動作の意味をきちんと確認して挑みます。ありがとうございました。

投稿2017/02/07 11:21

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問