尝试初始化内存映射文件时发生段违规

时间:2008-10-30 23:35:05

标签: c

以下是我用于创建memory mapped file的代码:

fid = open(filename, O_CREAT | O_RDWR, 0660);

if ( 0 > fid )
{
    throw error;
}

/* mapped offset pointer to data file */
offset_table_p = (ubyte_2 *) shmat(fid, 0, SHM_MAP);

/* Initialize table */
memset(offset_table_p, 0x00, (table_size + 1) * 2);

说table_size大约是2XXXXXXXX字节。

在调试期间,我注意到在尝试初始化'偏移表指针'时失败了,

任何人都可以向我提供一些关于它为什么在提升过程中失败的意见? 有没有可能我的内存映射文件没有创建所需的表大小?

2 个答案:

答案 0 :(得分:2)

据我阅读文档可以看出,你完全错了。

使用open()和mmap()或使用shmget()和shmat()。

如果你使用open(),你需要先让文件足够长。使用ftruncate()。

答案 1 :(得分:0)

首先要做的事情:

在open()调用之前和之后检查文件。如果在Linux上,您可以使用代码:

char paxbuff[1000];                            // at start of function
sprintf (paxbuff,"ls -al %s",filename);
system (paxbuff);
fid = open(filename, O_CREAT | O_RDWR, 0660);  // this line already exists.
system (paxbuff);

然后,在调用shmat()之后,检查返回值和大小:

offset_table_p = (ubyte_2 *) shmat(fid, 0, SHM_MAP);  // already exists.
printf ("ret = %p, errno = %d\n",offset_table_p,errno);
printf ("sz = %d\n",table_size);

这应该足以解决问题。