当前位置: 首页 > 知识库问答 >
问题:

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

何灼光
2023-03-14

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

#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个答案

於宾白
2023-03-14

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

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

 类似资料:
  • 我正在制作一个soundboard应用程序,当长按按钮1时,我需要共享sound1。我可以用以下代码创建共享菜单: 我可以与whatsapp和Google Drive完美共享音频文件,但其他应用程序不起作用。我听说您必须将文件复制到外部存储,并从那里共享它们。我已经搜索了将近两天,但我找不到这样做的方法。Stack上的其他文章也帮不了我:/ 如何在外部存储器中创建目录,将文件(sound1.ogg

  • 我有一个经过验证的谷歌客户端,我想列出其他人公用文件夹中的文件(我认为共享或不共享的文件夹是不相关的,因为它是公用的) 这是我在NodeJS中的代码 注意:文档中没有“folderId”选项:https://developers.google.com/drive/api/v3/reference/files/list-只是一个drivid选项 虽然我将corpa设置为“drive”和drive I

  • 我正在尝试传递一个位于我的应用程序的res/raw目录中的图像以及共享意图。 我遵循了FileProvider文档中描述的流程,下面是我的代码: Androidanifest.xml 我的活动中的代码: 由于无法访问我在其他应用程序中获取的文件,因此上述操作无效: java.io.FileNotFoundException:FILE_PATH:打开失败: EACCES(权限拒绝) 知道我做错了什么

  • 共享内存是两个或多个进程共享的内存。 但是,为什么我们需要共享内存或其他通信方式呢? 重申一下,每个进程都有自己的地址空间,如果任何进程想要将自己的地址空间的某些信息与其他进程进行通信,那么只能通过IPC(进程间通信)技术进行。 我们已经知道,通信可以在相关或不相关的进程之间进行。 通常,使用管道或命名管道来执行相互关联的进程通信。 可以使用命名管道或通过共享内存和消息队列的常用IPC技术执行无关

  • 在我的应用程序中,有一个进程将数据写入文件,然后响应接收到的请求,将通过网络将(一些)数据发送到请求进程。这个问题的基础是看看当两个进程碰巧在同一个主机上时,我们是否可以加快通信速度。(在我的例子中,进程是Java的,但我认为这个讨论可以更广泛地应用。) 有一些项目使用Java的FileChannel返回的MappedByteBuffer。map()作为在同一主机上的JVM之间共享内存IPC的一种

  • 问题内容: 我试图在共享内存上发布一些随机的东西;出于某些奇怪的原因,阅读器没有选择发件人写的东西 这是发件人: 这是读者: 如果重新启动阅读器,则阅读器确实能够读取发送方已写入的最后一个值。 但是,如果我先启动阅读器,然后再启动发送器,则阅读器不会拾取发送器写入的所有值。 为了使这个更奇怪,如果我在SHM :: read()中取消对printf语句的注释,那么读者有时可以使用。 任何的想法? G