プロデューサー/コンシューマーの問題を再現しようとしています。これまでのところ、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のソリューションではありません(それらを使用する必要があります。宿題です)。
アドバイスをいただければ幸いです。ありがとう。