Paylaşılan belleğin son zamanlarda kullanmış olduğu bir varyant, formamlamadan önce bir mmap açmaktır. Bu paylaşılan bellek api belirli kısıtlamaları önler. Boyut sınırınız yok (adres aralığı sınırdır), anahtarı bu mutlak dosyadan oluşturmanıza gerek yoktur. Nasıl yaptığımı İşte bir örnek
ppid = getpid();
shm_size = ...;
char *tmpFile = tempnam(NULL, "SHM_"); /* Generate a temp file which is virtual */
/* Before we fork, build the communication memory maps */
mm = open(tmpFile, O_RDWR|O_CREAT|O_TRUNC, 0664)); /* Create the temp file */
ftruncate(mm, shm_size); /* Size the file to the needed size, on modern Unices it's */
/* a sparse file which doesn't allocate anything in the file system */
/* The exact type of comm_area left to the implementer */
comm_area *pCom = (comm_area *)mmap(NULL, shm_size, PROT_READ|PROT_WRITE, MAP_SHARED, mm, 0);
if(pCom == (comm_area*)MAP_FAILED) handle_error();
close(mm); /* We can close the file, we won't access it via handle */
unlink(tmpFile); /* We can also remove the file so even if we crash we won't let corpses lying */
free(tmpFile);
/* Initialise some shared mutexes and semaphores */
pthread_mutexattr_t mattr;
pthread_mutexattr_init(&mattr);
pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);
pthread_mutex_init(&pCom->stderr_mutex, &mattr);
/* nSonAsked, global variable with the number of forked processes asked */
for(nSon=0; nSon<nSonsAsked; nSon++) {
printf("Setup son #%.2u ",nSon+1);
/* Initialize a semaphore for each child process */
sem_init(&pCom->sem_ch[nSon], USYNC_PROCESS, 0);
if(fork() == 0 {
... /* do child stuff*/
return;
}
/* Father, cleans up */
pthread_mutexattr_destroy(&mattr);
...
return;
Went ile Paylaşılan belleğe sahip olmanız gerekir. – Cheetah
Şüphesiz benzer bir metin burada (kredi için link vermek isteyebilirsiniz?): Http://www.unix.com/programming/857-fork-ipc.html – sje397
@ sje397: Bana atıfta bulunulmadığını işaret ettiğin için teşekkürler – sum1stolemyname