c - C 中的共享内存,shmdt 问题,它抛出无效参数

标签 c pointers

我有这样的结构

 typedef struct {
int id;     //Client ID
int size;   //Memory Size
int mem;    //ID obtained from shmid
int  buf;   //shared memory var
} Segm;

 Segm segms[10];
int count_s = 0;

     int * buffer; /* shared buffer */
        /* we declared to zone to share */
       buffer =  shmat (mem, (char *)0, 0);
       if (buffer == NULL) {
          fprintf (stderr, "Error reserve shared memory \n");
          return -1; 
       }
        segms[count_s].mem = mem;
        segms[count_s].buf = *buffer;

上面的代码为当前结构创建共享内存,并且工作正常,但是当我尝试分离内存时,shmdt 抛出错误,参数无效,我不明白为什么。

  int mem = segms[i].mem;

 /* detach from the segment: */
    if (shmdt(&segms[i].buf) == -1) {
              perror("[SHMservice] Error: shmdt");
              result = -2;
    }

   shmctl (mem, IPC_RMID, (struct shmid_ds *)NULL);

最佳答案

您向 shmdt 传递了错误的值:你给它的地址是 buf你的结构体的成员,而不是你存储在 int 中的指针变量。

要解决这个问题,首先要修复你的结构。 buf的类型应该是void* (或者 int* 如果这对您来说更实用)。然后修复附加代码来设置它:

segms[count_s].buf = buffer;

如果你选择void* ,您应该调整 buffer 的类型也是。

然后你就可以shmdt(segms[i].buff) .

关于c - C 中的共享内存,shmdt 问题,它抛出无效参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24473297/

相关文章:

C 开关默认情况不触发

通过欧几里得算法和霍纳方法转换数字

c - 我的 arm-none-eabi-gcc 在 stm32 上的项目有什么问题?

c - for 循环 - 为什么打印 12 而不是 3?

c - 为什么 -O1 比 -O2 快

c - 如何使用堆栈从函数返回值?

c - 初学者C分配

c - 带有结构体指针数组的 strcpy() 的段错误

c - 使用 free 作为动态数组结构的问题

c - GTK C 段 : Adding new signal causes segv