Я работаю над программой чтения/записи, в которой есть один писатель для n читателей. У меня возникла проблема, из-за которой, если подключено несколько читателей, как показано на скриншоте ниже, то все сообщение из общей памяти не отображается.
Вывод:
Введите сообщение: Тест
Читатель1: тест
Читатель2: тест
Писатель: тест тест
Читатель1: тест
Reader2: тестовый тест
Писатель:
Читатели:
Я попытался добавить переменную count, потому что я предполагаю, что очередь писателей помечается до того, как все читатели смогут печатать, и это заставляет писателя затем выходить из вложенного while() в писателе и останавливать читатели от печати.
Любые предложения о том, как заставить читателей печатать, будь то флаг или какой-то подсчет? Ниже также приложены скриншоты циклов записи и чтения.
Читатель:
int main() {
DataShared data;
data.turn = 0;
signal(SIGINT, sigHandler);
//generates key
key = ftok("mkey",65);
//returns an identifier in mId
if ((mId = shmget(key, SIZE, IPC_CREAT|S_IRUSR|S_IWUSR)) < 0){
perror("shared memory error");
exit(1);
}
// shmat to attach to shared memory
if((mPtr = shmat(mId, 0, 0)) == (void*) -1) {
perror("Can't attach\n");
exit(1);
}
while(1) {
// request critical section
while(!data.turn && data.count == 0) {
//not time for the reader, check if token is changed.
memcpy(&data, mPtr, sizeof(DataShared));
}
data.count++;
// enter critical section
usleep(1);
fprintf(stderr, "Read from memory: %s\n", data.message);
usleep(1);
// leave critical section
data.count--;
while(data.count > 0){
;
}
data.turn = 0;
memcpy(mPtr, &data, sizeof(DataShared));
};
return 0;
}
Писатель:
int main() {
DataShared data;
data.turn = 0;
data.count = 0;
signal(SIGINT, sigHandler);
key = ftok("mkey",65);
if((shmId = shmget(key, SIZE, IPC_CREAT|S_IRUSR|S_IWUSR)) < 0 ) {
perror("Error creating shared memory\n");
exit(1);
}
if((shmPtr = shmat(shmId, 0, 0)) == (void*) -1) {
perror("Can't attach\n");
exit(1);
}
while(1) {
while (data.turn) {
memcpy(&data, shmPtr, sizeof(DataShared));
}
// enter critical section
printf("Enter a message: \n" );
fgets(data.message, 1024, stdin);
// leave critical section
printf("Message written to memory: %s\n", data.message);
data.turn = 1;
memcpy(shmPtr, &data, sizeof(DataShared));
};
return 0;
}
ctrl-c
, в котором вызываетсяshmctl
, и программа завершается. - person Striker   schedule 03.10.2019