Использование буфера, созданного совместно используемой памятью через IPC в Linux - PullRequest
0 голосов
/ 26 ноября 2018

Я хочу создать некоторый буфер в виртуальной памяти и использовать его физическую память в другом приложении.

#include <stdio.h> 
#include <sys/shm.h> 
#include <sys/stat.h> 

int main () 
{
  int segment_id; 
  char* shared_memory; 
  struct shmid_ds shmbuffer; 
  int segment_size; 
  const int shared_segment_size = 0x6400; 
  int key = 1234;
  segment_id = shmget (key, shared_segment_size, 
                 IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR); 
  shared_memory = (char*) shmat (segment_id, 0, 0); 
  printf ("shared memory attached at address %p\n", shared_memory); 
  segment_size  =               shmbuffer.shm_segsz; 
  printf ("segment size: %d\n", segment_size); 
  /* Write a string to the shared memory segment.  */ 
  sprintf (shared_memory,"%p" shared_memory); 
 while(1)){}
return 0;
}

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

#include <iostream> 
#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <stdio.h> 
using namespace std; 

int main() 
{ 
    int shmid = shmget(1234,0x6400,PC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR); 
    char *str = (char*) shmat(shmid,(void*)0,0); 

    printf("Data read from memory: %s\n",str); 
      /// USE THIS str (address passed from previous application)
    shmdt(str); 
    shmctl(shmid,IPC_RMID,NULL); 

    return 0; 
} 

Можно ли использовать адрес, который я передаю из общей памяти, в другом приложении (см. Выше)?

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

Правильный ли этот подход?Любые выводы будут очень полезны.

1 Ответ

0 голосов
/ 26 ноября 2018

Доступ к общей памяти можно получить по ключу в разных процессах.Когда кто-то создает с ключом и IPC_CREAT, только использование того же ключа без IPC_CREAT может дать доступ к памяти.Каждый процесс будет иметь свою отдельную виртуальную память в той же физической памяти общей памяти.Передача адреса от одного процесса к другому не требуется, достаточно ключа.Если необходимо создать блок виртуальной памяти, просто предположите, что функция mmap () может помочь, но поможет ссылка на страницу man / info.

...