#c #posix #shared-memory #producer-consumer
#c #posix #разделяемая память #производитель-потребитель
Вопрос:
Я написал код производителя и потребителя, в котором последовательность символов, записанная в общую память из producer.c, считывается из consumer.c, но проблема возникла, когда я попытался отправить целочисленный массив из producer.c через общую память и прочитать из consumer.c
producer.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/mman.h>
int main(){
const int SIZE = 4096;
const char *Obj = "Shm";
int shm_fd;
void *ptr;
shm_fd = shm_open(Obj, O_CREAT | O_RDWR, 0666);
ftruncate(shm_fd, SIZE);
ptr = mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
if (ptr == MAP_FAILED)
{
printf("Map failedn");
return -1;
}
fgets(ptr, SIZE, stdin);
printf("Producer: Writing the sequence to the shared-memory object is done! n");
return 0;
}
consumer.c
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/mman.h>
int main()
{
const int SIZE = 4096;
const char *Obj = "Shm";
int shm_fd;
void *ptr;
shm_fd = shm_open(Obj, O_RDONLY, 0666);
if (shm_fd == -1)
{
printf("Shared memory failedn");
exit(-1);
}
ptr = mmap(0, SIZE, PROT_READ, MAP_SHARED, shm_fd, 0);
if (ptr == MAP_FAILED)
{
printf("Map failedn");
exit(-1);
}
printf("Consumer: The output sequence is: %d", (int *)ptr);
if (shm_unlink(Obj) == -1)
{
printf("Error removing the shared memory object %sn", Obj);
exit(-1);
}
return 0;
}
Комментарии:
1. У вас нет координации между производителем и потребителем. Потребитель может прочитать разделяемую память до того, как производитель записал в нее.
2. Сначала я запускаю производителя, а затем потребителя
3. Для имени разделяемой памяти в руководстве указано, что имя должно быть «/….».
4. Printf() в получателе должен быть «printf(«…..%s n», (char *)ptr);». Почему вы хотите печатать целые числа?