2

プロデューサー/コンシューマーの問題を再現しようとしています。これまでのところ、SystemV を使用して共有メモリを作成するメイン プログラムと、POSIX を使用してセマフォを作成し、プロデューサー プロセスがアクセスできるかどうかをテストしています。これまでの私のコードは次のとおりです。

boundedbuffer.c

#define SHMKEYPATH = "/dev/null" 
#define SHMKEYID 1
#define SEMKEYPATH = "/dev/null"
#define SEMKEYID 1

//Create Shared Memory
int shmid;
key_t shmkey;
void *shmaddress;
char *shm;

shmkey = ftok(SHMKEYPATH, SHMKEYID);
shmid = shmget(shmkey, sizeof(int) * 5, IPC_CREAT | S_IRUSR | S_IWUSR);
shmaddress = shmat(shmid, NULL, 0);
shm = (char*)(shmaddress);
*shm = 'b';
printf("Test share memory: currently %c",*shm);

//Create Semaphore
sem_t* my_semaphore;
char SEMAPHORE_NAME[] = "/my_semaphore5";
int my_semvalue = 10;
int value;

my_semaphore = sem_open(SEMAPHORE_NAME, O_CREAT | O_EXCL, S_IRUSR | S_IWUSR, my_semvalue);
sem_getvalue(my_semaphore, &value);
printf("sem val is %d\n", value);

//Execute Producer Process
int Ppid = fork();
if(Ppid == 0)
    execv("PATHTOPRODUCER", NULL);

//Print values from producer
shm = (char*)(shmaddress);
printf("%s", shm);

shmdt(shmaddress);
shmctl(shmid, IPC_RMID, NULL);

sem_getvalue(my_semaphore, &value);
printf("New val is %d", value);
sem_close(my_semaphore);
sem_unlink(SEMAPHORE_NAME);

プロデューサー.c

//Test shared memory
void *shm_address;
int semid, shmid, rc;
key_t shmkey;

shkey = ftok(SHMKEYPATH, SHMKEYID);
shmid = shmget(shmkey, sizeof(int) *5, IPC_CREAT | S_IRUSR | S_IWUSR);
shm_address = shmat(shmid, NULL, 0);
char *shm;
shm = (char*)(shm_address);
shm = "testing";
shmdt(shm_address);

2 つの問題があります。プロデューサーは共有メモリを変更していますが、境界バッファにメモリの内容を教えてもらうと、以前と同じです。これはある時点で機能していましたが、もはや機能したくありません。セマフォについては、新しいセマフォを作成せずにプロデューサーからアクセスする方法がわかりません。

私は長い間探していましたが、見つけることができるのは両方のPOSIXまたは両方のSystemVソリューションであり、セマフォ用のPOSIXと共有メモリ用のSystemVのソリューションではありません(それらを使用する必要があります。宿題です)。

アドバイスをいただければ幸いです。ありがとう。

4

0 に答える 0