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

Mac中的共享内存文件夹错误shm:参数无效,c,macos,process,shared-memory,C,Macos,Process,Shared Memory,我通常在linux中编写C代码。我现在用的是Mac电脑,我是这台机器的新手 在linux中,当我在进程之间使用共享内存时,内存被分配为/dev/shm/resource\u name中的文件 我正在尝试一个简单的代码,突然我得到了一个错误。 它无法调用函数destroy()来销毁共享内存 通常在这种情况下,我会手动删除目录中的文件 我的问题是:osx中的共享内存在哪里。因为当我尝试重新编译和执行时,编译器gcc告诉我资源已经存在,我不知道如何删除它 #include <stdio.h>

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

在linux中,当我在进程之间使用共享内存时,内存被分配为/dev/shm/resource\u 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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
整数增量(整数n)
{
n=n+1;
printf(“%d\n”,n);
返回n;
}
int*create()
{
int*ptr;
int ret;
int fd=shm|u open(“/shm”,O|u RDWR | O|u CREAT,S|u IRUSR | S|u IWUSR);
如果(fd==-1){
佩罗(“shm”);
出口(1);
}
ret=ftruncate(fd,sizeof(int));
如果(ret==-1){
佩罗(“shm”);
出口(2);
}
ptr=mmap(0,sizeof(int),PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);
如果(ptr==MAP_失败){
perror(“shm mmap”);
出口(3);
}
返回ptr;
}
无效销毁(int*ptr)
{
int ret;
ret=munmap(ptr,sizeof(int));
如果(ret==-1){
佩罗(“shm”);
出口(7);
}
ret=shm_取消链接(“shm”);
如果(ret==-1){
佩罗(“shm”);
出口(8);
}
}
int main(int argc,char*argv[])
{
sem_t*信号量;
int*ptr=create();
int numProcessesChilds,numIncrements;
int i;
如果(argc==3){
numProcessChilds=atoi(argv[1]);
numIncrements=atoi(argv[2]);
}
否则{
numProcessesChilds=10;
numIncrements=1;
}
*ptr=0;
信号量=sem_open(“/semaphore”,O_CREAT,0xFFFFFFFF,1);
if(信号量==SEM_失败){
佩罗(“信号量”);
}
对于(i=0;i
Mac OS X,比如linux,是基于UNIX的,所以它像linux一样处理共享内存。您分配的共享内存段也是位于/dev/shm中的文件


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

在编码之前,您是否做过任何研究,然后在此处询问?您遇到了什么错误?
perror
告诉你什么?在
destroy
中的两个系统调用中,哪一个失败了?可以选择让文件系统访问IPC对象。。。IPC有自己的名称空间。编写自己的命令以删除给定的IPC。对于SYSV IPC,您可以使用
ipcrm
命令,我认为没有POSIX等效命令(对吗?。@JoachimPileborg我得到了shm:Invalid arguments注意,您正在使用
/shm
创建和
shm
(没有反斜杠)关闭。。。另外,在Mac OS X“”(从
man
页面)。是的,我已经这样做了,但它是空的,当我再次执行时,我得到shm:Invalid参数。例如,如果我将内存的名称更改为“/shm1”,则运行效果会很好。但我不能用“shm”作为内存名。这意味着共享内存仍然存在,对吗?是的,你是,但奇怪的是你没有得到任何结果。尝试ipcs-m或ipcs-m。是的,相同。我刚刚用不同的名字创建了一个新的共享内存。当我销毁它时,我用同一个指针删除了旧的共享内存,它成功了。
man ipcs
说它是用于SystemV ipc的,但OP询问的是shm_open,它是POSIX共享内存。
ipcs
是否应该同时适用于这两种情况?@Nevado这已经很老了,但我在手册页上读到,您必须调用
shm_unlink
并关闭所有打开的文件描述符(通过结束进程或其他方式)以删除共享内存。很可能是
ipcrm
做到了这一点。