尝试做shmat时的分配错误

时间:2016-05-07 13:20:56

标签: c linux

当试图做shmat我得到分配错误,告诉我我不能记住记忆,它之前没有发生在我身上,我真的不知道该怎么做。 这是错误:

  

0xffffffffffffffff错误:无法访问地址0xffffffffffffffff

的内存

和wiered的事情是vecBoard在流程映射区域中分配,并且只有在触发shmat时才会发疯。谢谢大家!

    #include <string.h>
    #include <stdio.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <sys/fcntl.h>
    #include <errno.h>
    #include <fcntl.h>
    #include <time.h>
    #include <signal.h>
    #include <sys/ipc.h>
    #include <sys/shm.h>
    #include <sys/sem.h>

    #define SHM_SIZE 4096
    #define FLAGS IPC_CREAT 
    #define COLUMNS  8
    #define ROWS  8
    key_t key;    

int main()
{ 
     char* vecBoard;

    // Creating shared memory :

    if ((key = ftok("ex31.c",'k')) == -1)
    {
        perror("ftok");
        exit(1);
    }
    int shm_id;
    shm_id=shmget(key,SHM_SIZE,FLAGS);
    if(shm_id==-1)
    {
        printf("error creating shared memory\n");
        exit(0);
    }
    printf("the shared memory segment ID is: %d\n",shm_id);

    vecBoard = (char *)shmat(shm_id,0,0);
    if((vecBoard = (char *)shmat(shm_id,0,0)) == (char*)-1)
    {
        printf("error in attaching to the shared memory\n");
        exit(0);
    }
}

2 个答案:

答案 0 :(得分:0)

显示的代码对同一个内存段调用shmat()两次。

这显然是错的。

答案 1 :(得分:0)

查看errno有助于诊断问题(例如,在失败时调用perror而不仅仅是printf)。操作系统在系统调用失败时为您提供信息;不要忽视它!

如果仔细阅读shmget的手册页,则第三个参数(flags)应该以低9位包含共享内存段所需的权限。如果您只是在此处传递IPC_CREAT,那么这些位将被清除为0,因此您创建了一个没有人具有读取或写入权限的段。因此,shmat失败(使用EACCES因为您(隐含地)要求同时读取和写入该细分受众群,并且您无权执行这两项细分。

如果您希望当前用户能够访问该细分,您可能希望将其更改为IPC_CREAT | 0600

请注意,在再次测试之前,您可能必须使用错误的权限删除现有的共享内存段。使用ipcsipcrm工具。