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;
}
Kodlamadan önce herhangi bir araştırma yaptınız mı? – trojanfoe
* Ne * hatası alıyorsunuz? Perror sana ne anlatıyor? Ve * hangi iki sistemin "yok etme" olarak adlandırdığı, bu başarısız mı? –
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?). –