2011-05-09 28 views
0

2つのプロセス間で整数を共有しようとしていますが、メモリセグメントはプログラム1で初期化され、プログラム4で使用されます。プログラム1の初期化は次のとおりです。整数を単に共有メモリセグメントに格納する:C

shmid = shmget(key, sizeof(int*), 0666 | IPC_CREAT); 
int *data = (int *)shmat(shmid, (void*)0,0); 

ここでは、「異なるサイズの整数からポインタへキャスト」という警告が表示されます。アー。

シンプルに、私は推測していますが、私はIPCで大きな時間を過ごしています。そして、Cの他の多くの事....

は、その後、私は別のプログラムに渡す:

snprintf(shmarg, sizeof(shmarg), "%n", data); 
pid_t pid3 = run_cmd4("/home/tropix/hw11-4", shmarg, semarg, pipe_from_p2_2, pipe_to_p5_2); 

しかし、他の側でそれにアクセスする方法がわかりません。プログラム4でintを取得するにはどうすればよいですか?

答えて

4

shmat()というヘッダーがないので、コンパイラはshmatがint(ポインタではない)を返すと推測しています。

+0

それはありがとう:) – Josh

1

ここでは、「異なるサイズの整数からポインタへキャスト」という警告が表示されます。アー。

(void*)0の代わりにNULLを使用してください。

それから私は別のプログラムに渡す:

snprintf(shmarg, sizeof(shmarg), "%n", data); 
pid_t pid3 = run_cmd4("/home/tropix/hw11-4", shmarg, 
         semarg, pipe_from_p2_2, pipe_to_p5_2); 

されていないが、他の側でそれにアクセスする方法を確認してください。プログラム4でintを取得するにはどうすればよいですか?

共有メモリ領域が他のプログラムのまったく同じ仮想メモリアドレスにロードされない限り、ポインタ自体は役に立ちません。他のプログラム(hw11-4)が共有メモリセグメントをロードしてOSに仮想メモリアドレスを選択させ、次にそのアドレスをintのために見るだけです。したがって、hw11-4は同じ共有メモリキー(コマンドライン引数など)を渡す必要があり、それ自体でshmgetを開いてキーを取得し、shmatをメモリにマップします。

関連する問題