2009-11-04 14 views
6

私は子プロセスがLinux上でお互いに通信するプログラムを書こうとしています。Cでintと配列を共有メモリにどのように保持しますか?

これらのプロセスはすべて同じプログラムから作成され、コードを共有します。

2つの整数変数と整数配列にアクセスする必要があります。

私は共有メモリがどのように動作しているのかわかりません。私が検索したすべてのリソースは何もしていませんが、私を混乱させます。

ご協力いただければ幸いです!

編集:ここでは、1つのintを共有するためにこれまで書いたコードの例を示しますが、間違っている可能性があります。

+4

どちらのオペレーティングシステムを使用していますか? –

+1

私の間違い。これはLinux上にあります – Josh

+0

昨日からのこの質問に注意してください:http://stackoverflow.com/questions/1664519/creating-accessing-shared-memory-in-c(Sys V IPCを選択しましたが、同じ一般的な件名です)。 –

答えて

6

共有メモリのサイズを大きくする必要があります。どのくらいの配列が必要ですか?どのような価値であれ、共有メモリセグメントを作成する前にそれを選択する必要があります。ダイナミックメモリはあまりうまく機能しません。

共有メモリに接続すると、開始アドレスへのポインタが得られます。どのような目的にも使用できるように十分に整列しています。共有メモリにアクセスするためのポインタの使用に注意してください:

enum { ARRAY_SIZE = 1024 * 1024 }; 
int segmentId; 
int *sharedInt1; 
int *sharedInt2; 
int *sharedArry; 

const int shareSize = sizeof(int) * (2 + ARRAY_SIZE); 
/* Allocate shared memory segment */ 
segmentId = shmget(IPC_PRIVATE, shareSize, S_IRUSR | S_IWUSR); 

/* attach the shared memory segment */  
sharedInt1 = (int *) shmat(segmentId, NULL, 0); 
sharedInt2 = sharedInt1 + 1; 
sharedArry = sharedInt1 + 2; 

/* Rest of code will go here */ 
...fork your child processes... 
...the children can use the three pointers to shared memory... 
...worry about synchronization... 
...you may need to use semaphores too - but they *are* complex... 
...Note that pthreads and mutexes are no help with independent processes... 

/* detach shared memory segment */ 
shmdt(sharedInt1); 
/* remove shared memory segment */ 
shmctl(segmentId, IPC_RMID, NULL); 
+0

これはかなりいいようです。本当にありがとう! – Josh

0

このガイドは便利です:http://www.cs.cf.ac.uk/Dave/C/node27.html。いくつかのサンプルプログラムが含まれています。

Linux man pages onlineもあります。

+0

ありがとうございますが残念ながらそれは私を徹底的に混乱させるページの1つです。 – Josh

+0

サンプルコードをコピーして貼り付けてコンパイルしてみましたか?コンパイルすることができれば、それを理解するための半分の方法でしょう。 –

+0

この問題の私の問題は、クライアントとサーバーのやりとりで異なるプログラムが話しているようです。当初の質問では私が必要としていたことを明確にしていませんでしたが、私のコードでは同じプログラムから複数のプロセスを作成し、通信する必要があります。 – Josh

0

共有メモリは、1つのプロセスによって割り当てられたメモリのセグメントであり、一意のIDを持ち、他のプロセスも同じIDで割り当てを行います。メモリのサイズは、使用しているので、2つの整数と整数配列を持つ構造体があります。

ここでは両方とも同じメモリへのポインタを持っています。したがって、1つの書き込みはそこにあったものを上書きし、もう1つはすぐにアクセスします。

+0

@Josh no、コメントの書式設定は、かわいい岩を吸いますが、コメントを書くのではなく、あなたの質問を編集してコメントを明確にする必要があります。 –

+0

元の質問に説明を追加することをお勧めします。 –

+0

@Josh - このチュートリアルは、http://www.ecst.csuchico.edu/~beej/guide/ipc/shmem.htmlを参照してください。ftokを使用してコール。 –

0

あなたのコメントから、あなたは​​3210を使用しているようですが、それは間違っています(「プライベート」なのは、共有のためのものではないことを示唆していますか?

#include <sys/ipc.h> 
#include <sys/shm.h> 

... 

int segid = shmget((key_t)0x0BADDOOD, shareSize, IPC_CREAT); 
if (segid < 0) { /* insert error processing here! */ } 
int *p = (int*) shmat(segid, 0, 0); 
if (!p) { /* insert error processing here! */ } 
+0

それは面白そうです。私はそれがCの場合、pはこの場合int型の配列になるでしょう。私はまたshmgetであなたが持っている16進値について興味があります。 – Josh

+0

IPC_PRIVATEは、親が共有メモリを作成し、それを共有する子をフォークする場合に機能します。 –

+0

@ Josh:共有メモリのキーとして32ビットの値が必要です。 ftok()を使用して作成するか、固定名を選択することができます。 No Bad Doodは他の共有メモリと同じくらい良い名前です。 0xDEADBEEFは別のよく知られた値です。しかし、親プロセスがフォークする前に共有メモリを作成して接続している限り、IPC_PRIVATEも有効です。 –

関連する問題