Mac中的共享内存文件夹错误shm:无效的参数

时间:2016-04-13 10:34:10

标签: c macos process shared-memory

我通常在linux中编写C代码。我现在正在使用Mac,而且我是这台机器的新手。

在linux中,当我在进程之间使用共享内存时,内存被分配为/ dev / shm / resource_name中的文件

我正在尝试一个简单的代码,突然间我遇到了错误。 它无法调用函数destroy()来破坏共享内存

通常在发生这种情况时,我会在目录上手动删除该文件。

我的问题是:osx中的共享内存位于何处。因为当我尝试重新编译和执行时,编译器gcc告诉我资源已经存在,我不知道如何删除它。

#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;
}

1 个答案:

答案 0 :(得分:0)

Mac OS X,就像linux一样基于UNIX,所以它像Linux一样处理共享内存。您分配的共享内存段也是位于/ dev / shm

中的文件

要销毁共享内存,您可以使用命令ipcs -mipcs -M查看所有共享内存,查找您的内容,然后执行ipcrm -m shmid,其中shmid将是您的ID共享内存。您也可以使用分配给它的密钥ipcrm -M shmkey