2010-04-21 25 views
12

Her iki işlem arasında "genel" olması için aynı değişkeni (int türünde) okuyabilmeleri ve yazabilmeleri için üst ve alt işlem sürecine ihtiyacım var.C - fork() ve paylaşımlı bellek

Bunun bir çeşit çapraz işlem iletişimi kullanacağını ve bir işlemin güncellenmekte olan tek bir değişkeni kullanacağını varsayıyorum.

Hızlı bir google ve IPC yaptım ve çeşitli teknikler ortaya çıktı ancak durumum için hangisinin en uygun olduğunu bilmiyorum.

Hangi teknik en iyisidir ve bunun için bir noobs öğreticisine bir bağlantı sağlayabilir misiniz?

Teşekkürler.

cevap

15

çatalı() kullanarak söz olduğundan, sana Unix.com

itibaren bir * UNIX IPC'leri kullanarak süreçler arasında veri paylaşmak için birincil yolu nix-System

yaşıyoruz varsayalım : Bir önceki sayfadaki gibi bir araya getirilebilir. (1) Paylaşılan hafıza;

(2) Yuva:

(3) Mesaj kuyrukları da dahil olmak üzere diğer UNIX IPC'lerdir vardır.

(4) Semaforlar;

(5) İşaretler.

En iyi bahsiniz (IPC'ler için), yayına dayanarak paylaşılan bellek bölümlerini kullanmaktır. Paylaşılan bellek işlemlerinin atomik olduğundan emin olmak için semaphores 'u kullanmanız gerekebilir.

çatallanmasını Üzerine Bir öğretici ve paylaşılan bellek dev kulübenize geçerli:

http://forums.devshed.com/c-programming-42/posix-semaphore-example-using-fork-and-shared-memory-330419.html

(uygulamanız için eğer appilcable) çoklu kullanmanın başka daha derinlemesine açıklama burada bulunabilir:

https://computing.llnl.gov/tutorials/pthreads/

+0

Went ile Paylaşılan belleğe sahip olmanız gerekir. – Cheetah

+2

Şüphesiz benzer bir metin burada (kredi için link vermek isteyebilirsiniz?): Http://www.unix.com/programming/857-fork-ipc.html – sje397

+0

@ sje397: Bana atıfta bulunulmadığını işaret ettiğin için teşekkürler – sum1stolemyname

4

Bellek paylaşmanız gerekiyorsa, belki de iş parçacığı yerine iş parçacıkları kullanmak daha iyi bir çözüm olur mu?

+0

Onun üniversite için bir atama (Ben kısa olması açısından kontrol hatası dışında kalan). Sonunda Çatal() özel olarak – Cheetah

2

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; 
İlgili konular