Чтение файла, хранящегося в сегменте, и отправка байтов - PullRequest
0 голосов
/ 09 марта 2020

У меня есть файл, который я сохранил в структуре в сегменте из другого процесса A. Теперь из процесса BI нужно получить этот файл и преобразовать его в байты, чтобы я мог отправить его или отправить при чтении его байтов, что бы быть идеальным способом сделать это? см. ниже:

typedef struct mysegment_struct_t {
    FILE *stream;
    size_t size;
}

поэтому у меня есть сопоставление с сегментом, и все просто не уверены, как его получить сейчас

size_t bytes_sent;
struct mysegment_struct_t *fileinfo = 
(struct mysegment_struct_t *)mmap(NULL,size,PROT_READ | PROT_WRITE, MAP_SHARED, fd,0);

//read stream into a byte array? (how can this be done in c)
//FILE *f  = fopen(fileinfo->stream, "w+b");   //i a bit lost here, the file is in the segment already

//send bytes
while (bytes_sent < fileinfo->size) {
  bytes_sent +=send_to_client(buffer, size); //some buffer containing bytes?
}

Я новичок в C программировании, но Я не могу найти что-то вроде чтения файла в памяти в байтовый массив, например.

Спасибо

enter image description here

из блога https://www.softprayog.in/programming/interprocess-communication-using-posix-shared-memory-in-linux

должен быть способ, которым я могу поделиться файлом между процессами, используя общую память.

1 Ответ

3 голосов
/ 09 марта 2020

Вы просто не можете этого сделать. Указатель stream указывает на объекты, которые существуют только в памяти процесса A и не находятся в области общей памяти (и даже если бы они были, они обычно не отображались бы по одному и тому же адресу). Тебе придется придумать что-то еще.

Одной из возможностей является отправка файлового дескриптора через сокет домена Unix, см. Переносимый способ передачи файлового дескриптора между различными процессами . Однако, вероятно, стоит отступить и подумать о том, зачем вам в первую очередь передавать открытый файл между процессами, и есть ли лучший способ достичь вашей общей цели.

...