当试图做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);
}
}
答案 0 :(得分:0)
显示的代码对同一个内存段调用shmat
()两次。
这显然是错的。
答案 1 :(得分:0)
查看errno
有助于诊断问题(例如,在失败时调用perror
而不仅仅是printf
)。操作系统在系统调用失败时为您提供信息;不要忽视它!
如果仔细阅读shmget
的手册页,则第三个参数(flags
)应该以低9位包含共享内存段所需的权限。如果您只是在此处传递IPC_CREAT
,那么这些位将被清除为0,因此您创建了一个没有人具有读取或写入权限的段。因此,shmat
失败(使用EACCES
因为您(隐含地)要求同时读取和写入该细分受众群,并且您无权执行这两项细分。
如果您希望当前用户能够访问该细分,您可能希望将其更改为IPC_CREAT | 0600
。
请注意,在再次测试之前,您可能必须使用错误的权限删除现有的共享内存段。使用ipcs
和ipcrm
工具。