2011-06-23 17 views
7

Zaten bulabildiğim tek gönderiye baktım, ama aradığım şey bu değildi.Paylaşılan belleği fork() ile kullanma

Temel olarak, Odd-Even Sort'u forking ile çalıştırmaya çalışıyorum, bu nedenle çocuk oranlar çalıştırıyor ve üstler evensleri çalıştırıyor. Bunların ikisi de vektör inputValues'in ve boole sıralamasının paylaşılmasını gerektirir.

Aşağıdaki kod hafızayı paylaşan benim başarısız girişimleri hiçbiri olmadan ve arama algoritması ile çatalları kullanmak için sadece temel çerçeve: Bu paylaşımı dışarı hack için birden fazla yol denedim

while(!sorted) 
{ 
    pID = fork(); 
    sorted = true; 
    cout << "Sort set to TRUE." << endl; 

    if(pID == 0) 
    { 
     int num = 1; 
     cout << "Child swap run" << endl; 
     Swap((void *) num); 
     cout << "Status: " << ((sorted) ? "SORTED" : "UNSORTED") << endl; 
     exit(0); 
    } 
    else if(pID < 0) 
    { 
     cout << "Failed to fork." << endl; 
     exit(1); 
    } 
    else 
    { 
     wpid = waitpid(pID, &status, waitStatus); 
     int num = 0; 
     cout << "Parent swap run" << endl; 
     Swap((void *) num); 
     cout << "Status: " << ((sorted) ? "SORTED" : "UNSORTED") << endl; 
    } 
} 

Bellek, ancak NASIL çalıştığı, neye ihtiyacım olduğunu ve bunu yapmanın en iyi yolunu gerçekten açıklayan herhangi bir kaynak bulamıyor. aşağıdaki gibi

Yani, benim gereksinimleri:

  • ebeveyn ve çocuk global vektör ve paylaşmak ve işlemek gerekir boole
  • gösterildiği gibi bu bir döngü içinde çalıştırmak gerekir
  • Bu değişkenlerle çalışmalıdır ana içinde() kullanılıyor ve herhangi bir ipucu varsa takas() fonksiyonu

yılında, onları büyük ölçüde takdir ediyorum. Teşekkürler!

+0

'shm_open' POSIX API çağrısı için man sayfasına bakın. Paylaşılan bellek bölgesi oluşturmak ve oradaki her iki işlem tarafından erişilen değişkenleri koymak istiyorsunuz. Bunu kolayca 'mmap' çağrısı ile de yapabilirsiniz. Erişiminizi iş parçacığı için güvenli hale getirdiğinizden emin olun ... Paylaşılan belleği kullanmanın sakıncası yoktur, bu yüzden dikkatli olmalısınız. – Borealid

+0

"shm_open" ile aklınızda bulundurun, sonra paylaşılan bellek nesnesi için alan ayırmak için 'ftruncate' olarak adlandırmanız gerekecek, bu nedenle bellek nesnesindeki boşluk dinamik olarak bir std :: vector'. Daha fazla alana ihtiyacınız varsa, çalışma zamanında paylaşılan bellek nesnesinin boyutunu manuel olarak yönetmeniz gerekir. – Jason

+0

Bu açıkça C kodu değil. – Puppy

cevap

4

Paylaşılan bir bellek nesnesini ayarlamak için shmget() ve shmat() kullanmak zorundasınız, ancak maalesef bu std::vector gibi bir dinamik bellek nesnesi olmayacak. Diğer bir deyişle, paylaşılan bellek nesnesinin başlangıç ​​noktasında nesnenin tüm boyutunu bildirmeniz gerekir. Süreç oldukça basittir, ebeveyninizde, paylaşılan bellek nesnesini oluşturmak ve nesne için bir kimlik değeri almak için IPC_CREAT bayrağıyla shmget()'u arayacaksınız. Ardından, nesneye bir işaretçi almak için kimlik değeriyle shmat() numaralı telefonu arayın. Ardından, nesneyi varsayılan değerlerle başlat. Çocuğunuzun işlemine çatalladığınızda, shmat()'dan dönen işaretçi hala çocuk işleminde geçerli olacaktır, böylece aynı gösterici değişkenini kullanarak hem ebeveyn hem de çocukta belleği paylaşabilirsiniz. Eğer 0 daha büyük bir değere ayarlanmış pshared özniteliği ile herhangi çocuklara sem_init() kullanarak bir semafor çatal önce

Ayrıca üst süreçte beyan etmek isteyeceksiniz. Daha sonra hem ebeveyn hem de çocuk süreçleri paylaşılan hafıza nesnesine erişimi kontrol etmek için semafor kullanabilir. Yine de, paylaşılan bellek nesnesinin dinamik bir nesne olmadığını akılda tutsanız da, bunu başlattığınızda bunun için yeterli alan ayırmanız gerekecektir.

İlgili konular