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