Ben au lieu de new Data[N], tu peux faire ton new dans un espace préalloué qui est partagé avec d'autres processes.
En gros, sous Linux, un truc du genre :
Code:
int fd = open("/dev/shm/my-memory", O_RDWR);
assert(fd >= 0);
size_t length = sizeof(Data) * N;
int err = ftruncate(fd, length);
assert(err == 0);
void *mem = mmap(NULL, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
assert(mem != MAP_FAILED);
Data* ptr = new (mem) Data[N];
handle = getIPCHandle(ptr, N);
Et pour lire la mémoire depuis un autre process:
Code:
int fd = open("/dev/shm/my-memory", O_RDONLY);
assert(fd >= 0);
size_t length = sizeof(Data) * N;
void *mem = mmap(NULL, length, PROT_READ, MAP_SHARED, fd, 0);
assert(mem != MAP_FAILED);
// Ici on peut lire depuis mem, les données écrites par l'autre process
Ca marche aussi probablement avec n'importe quel fichier, même en dehors de /dev/shm, mais /dev/shm est normalement garanti d'être un filesystem virtuel en RAM, donc pas de flush disque.
Ca peut se faire aussi plus simplement avec un mapping anonyme si l'autre process est forké directement, en partageant le file descriptor plutôt que d'avoir à réouvrir le fichier.
- - - Mise à jour - - -
(J'ai fait ça de tête, pas sûr que ça marche direct, mais l'idée est là)