отправка массива целых чисел через общую память

#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);». Почему вы хотите печатать целые числа?