6

Linux で子プロセスが相互に通信するプログラムを作成しようとしています。

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

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

共有メモリがどのように機能するかはわかりません。検索したすべてのリソースは、私を混乱させるだけでした。

どんな助けでも大歓迎です!

編集: これは、1 つの int を共有するためだけにこれまでに作成したコードの例ですが、おそらく間違っています。

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

/* attach the shared memory segment */    
sharedInt = (int) shmat(segmentId, NULL, 0);  

/* Rest of code will go here */  

/* detach shared memory segment */  
shmdt(sharedInt);  
/* remove shared memory segment */  
shmctl(segmentId, IPC_RMID, NULL);
4

4 に答える 4

8

共有メモリのサイズを増やす必要があります。どのくらいの大きさのアレイが必要ですか?値が何であれ、共有メモリセグメントを作成する前にそれを選択する必要があります。動的メモリはここではあまりうまく機能しません。

共有メモリに接続すると、開始アドレスへのポインタを取得します。あらゆる目的に使用できるように十分に位置合わせされます。したがって、2つの変数へのポインターを作成し、これらの線に沿って配列することができます(コード例からスケルトンの一部を記述します)-共有メモリにアクセスするためのポインターの使用に注意してください。

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);
于 2009-11-04T03:15:22.560 に答える
1

あなたのコメントから、あなたは を使用しているように見えますがIPC_PRIVATE、それは間違いなく間違っているように見えます (「プライベート」の種類は、共有するためのものではないことを示唆していますね?-)。次のようなものを試してください:

#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! */ }
于 2009-11-04T02:59:56.127 に答える
0

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

Linux の man ページもオンラインにあります。

于 2009-11-04T02:30:52.253 に答える
0

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

これで、どちらも同じメモリへのポインタを持つようになり、一方の書き込みによってそこにあったものが上書きされ、もう一方はすぐにアクセスできるようになりました。

于 2009-11-04T02:31:16.153 に答える