我通常在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;
}
答案 0 :(得分:0)
Mac OS X,就像linux一样基于UNIX,所以它像Linux一样处理共享内存。您分配的共享内存段也是位于/ dev / shm
中的文件要销毁共享内存,您可以使用命令ipcs -m
或ipcs -M
查看所有共享内存,查找您的内容,然后执行ipcrm -m shmid
,其中shmid将是您的ID共享内存。您也可以使用分配给它的密钥ipcrm -M shmkey