2016-04-13 29 views
1

Genelde linux'da C kodunu kodlarım. Şimdi bir Mac kullanıyorum ve bu makinede yeniyim.paylaşılan bellek klasörü shm: Geçersiz argüman

Ben sürecin arasında paylaşılan bellek kullanmak linux olarak, bellek/dev/shm/resource_name

ben basit bir kod çalışıyordu bir dosya olarak tahsis ve aniden bir hata var olduğunu. Paylaşılan belleği yok etmek için bir işlevi yok etme() işlevini kullanamadı (

Genellikle bu olduğunda, dosyayı dizinde el ile siliyorum.

Soruma soru: osx'te paylaşılan belleği nerede bulunur. Çünkü derlemeyi ve çalıştırmayı denediğimde derleyici gcc, kaynağın zaten mevcut olduğunu ve nasıl silineceğini bilmediğimi söylüyor.

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/mman.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <semaphore.h> 
#include <unistd.h> 
#include <stdlib.h> 

int increment (int n) 
{ 
    n = n + 1; 
    printf ("%d\n", n); 
    return n; 
} 

int *create() 
{ 
    int *ptr; 
    int ret; 

    int fd= shm_open ("/shm", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); 
    if (fd == -1) { 
    perror ("shm"); 
    exit (1); 
    } 

    ret = ftruncate (fd, sizeof (int)); 
    if (ret == -1) { 
    perror ("shm"); 
    exit (2); 
    } 

    ptr = mmap (0, sizeof (int), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 
    if (ptr == MAP_FAILED) { 
    perror ("shm-mmap"); 
    exit (3); 
    } 
    return ptr; 
} 

void destroy (int *ptr) 
{ 
    int ret; 
    ret = munmap (ptr, sizeof (int)); 
    if (ret == -1) { 
    perror ("shm"); 
    exit (7); 
    } 
    ret = shm_unlink ("shm"); 
    if (ret == -1) { 
    perror ("shm"); 
    exit (8); 
    } 
} 

int main (int argc, char *argv[]) 
{ 
    sem_t *semaphore; 
    int *ptr = create(); 
    int numProcessesChilds, numIncrements; 
    int i; 
    if (argc == 3) { 
    numProcessesChilds = atoi (argv [1]); 
    numIncrements = atoi (argv [2]); 
    } 
    else { 
    numProcessesChilds = 10; 
    numIncrements = 1; 
    } 
    *ptr = 0; 

    semaphore = sem_open("/semaphore", O_CREAT, 0xFFFFFFFF, 1); 
    if (semaphore == SEM_FAILED) { 
    perror("semaphore"); 
    } 

    for (i = 0; i < numProcessesChilds; i++) { 
    switch (fork()) { 
    case -1: 
     perror ("fork"); 
     exit (1); 
    case 0: 
     sem_wait(semaphore); 

     for (i = 0 ; i < numIncrements; i++) { 
     (*ptr) = increment (*ptr); 
     } 
     sem_post(semaphore); 
     exit (0); 
    } 
    } 
    for (i = 0; i < numProcessesChilds; i++) { 
    wait (NULL); 
    } 
    sem_close(semaphore); 
    sem_unlink("/semaphore"); 

    printf ("Fina value: %d\n", *ptr); 
    destroy (ptr); 
    return 0; 
} 
+0

Kodlamadan önce herhangi bir araştırma yaptınız mı? – trojanfoe

+0

* Ne * hatası alıyorsunuz? Perror sana ne anlatıyor? Ve * hangi iki sistemin "yok etme" olarak adlandırdığı, bu başarısız mı? –

+0

IPC nesnelerine dosya sistemi erişimi olması isteğe bağlı ... IPC'nin kendi ad alanı vardır. Verilen bir IPC'yi kaldırmak için kendi komutunuzu yazın. SYSV IPC için 'ipcrm' komutunu kullanabilirsiniz, sanırım POSIX eşdeğer bir komut yoktur (doğru muyum?). –

cevap

0

Linux gibi Mac OS X, Linux gibi paylaşılan belleği işleyeceği şekilde Linux tabanlı UNIX tabanlı. Eğer tahsis paylaşılan bellek kesimleri de

, tüm paylaşılan hafızayı görüntülemek için komut ipcs -m veya ipcs -M kullanabilirsiniz paylaşılan hafızayı yok senin için bakmak ve shmid nerede olacağını sonra ipcrm -m shmid yürütmek için/dev/SHM bulunan dosyaları vardır paylaştığınız hafızanın kimliği. ipcrm -M shmkey numaralı telefonu da atamış olduğunuz tuşu kullanarak da yapabilirsiniz.

+0

Evet Bunu zaten yaptım ama boş ve tekrar çalıştırdığımda shm olsun: Geçersiz argüman. Ve eğer hafızanın adını değiştirirsem, örneğin, "/ shm1" mükemmel çalışır. Ama "shm" yi bellek adı olarak kullanamıyorum. Bu paylaşılan bellek hala var mı? – lmbcosta

+0

Evet, ama hiçbir sonuç almadığın garip. Ipcs -m veya ipcs -M'yi deneyin. – Nevado

+0

Evet aynısı. Farklı bir adla yeni bir paylaşılan bellek oluşturdum. Onu yok ettiğimde eski bir paylaşımlı belleği silmek için aynı işaretçiyi kullandım ve işe yaradı. – lmbcosta

İlgili konular