C mremap函数无法分配新内存
我已经写了下面的代码,但是代码仍然是fivenmeC mremap函数无法分配新内存,c,shared-memory,mmap,C,Shared Memory,Mmap,我已经写了下面的代码,但是代码仍然是fivenmeEEERROR消息,它告诉我mremap无法扩展内存 int main() { int size_of_mem = 1024 int fd = shm_open("/myregion", O_CREAT | O_RDWR, S_IRWXO | S_IRUSR | S_IWUSR); if (fd == -1) printf("ERROR in shm_open \n") ; if (ftruncate(fd, s
EEERROR
消息,它告诉我mremap
无法扩展内存
int main()
{
int size_of_mem = 1024
int fd = shm_open("/myregion", O_CREAT | O_RDWR, S_IRWXO | S_IRUSR | S_IWUSR);
if (fd == -1)
printf("ERROR in shm_open \n") ;
if (ftruncate(fd, size_of_mem) == -1)
printf("ERROR in ftruncate \n") ;
int shm_address = mmap(0 , size_of_mem , PROT_READ | PROT_WRITE | PROT_EXEC ,MAP_SHARED , fd , 0) ;
if (shm_address == MAP_FAILED)
{
printf("Error mmapping the file \n");
exit(EXIT_FAILURE);
}
int temp = mremap(shm_address , size_of_mem ,4000 , MREMAP_MAYMOVE) ;
if( temp < 0)
{
printf("EEEEEEEERROR\n") ;
}
return 0 ;
}
intmain()
{
int size_of_mem=1024
int fd=shm_open(“/myregion”,O|u RDWR,S|u IRWXO | S|u IRUSR | S|IWUSR);
如果(fd==-1)
printf(“shm_打开时出错”);
如果(ftruncate(fd,内存的大小)=-1)
printf(“ftruncate中的错误\n”);
int shm_address=mmap(0,内存大小,保护读取,保护写入,保护执行,映射共享,fd,0);
如果(shm_地址==映射_失败)
{
printf(“映射文件时出错\n”);
退出(退出失败);
}
int temp=mremap(shm地址,内存大小,4000,mremap可移动);
如果(温度<0)
{
printf(“eeeeerror\n”);
}
返回0;
}
这里有几件事不对
首先,mmap()
和mremap()
返回一个void*
指针,不能将其强制转换为int
Second,mremap()
声明:
返回值
成功时,mremap()返回指向新虚拟内存区域的指针。出现错误时,返回值MAP_FAILED(即,(void*)-1),并正确设置errno
所以您的检查temp<0
是错误的。它应该是temp==(void*)-1
。当转换为int时,mremap()
完全可能在成功时返回小于零的有效指针
Third,mmap()
和mremap()
在发生错误时设置errno
()变量。你可以阅读这篇文章来获得更多关于到底哪里出了问题的信息。要仅输出文本错误消息,请使用peror()
函数()。请注意,您必须为此包含
第四个,如果检测到错误情况,则始终打印消息,但通常允许继续执行。那没有道理。如果shm\u open()
失败,您希望立即返回(或调用exit(exit\u FAILURE)
)。如果您甚至无法打开SHM文件,则以下函数都无法工作
因此,我的清理版本如下所示:
#include <error.h>
int main()
{
int size_of_mem = 1024;
int fd = shm_open("/myregion", O_CREAT | O_RDWR,
S_IRWXO | S_IRUSR | S_IWUSR);
if (fd == -1)
{
perror("Error in shm_open");
return EXIT_FAILURE;
}
if (ftruncate(fd, size_of_mem) == -1)
{
perror("Error in ftruncate");
return EXIT_FAILURE;
}
void *shm_address = mmap(0, size_of_mem,
PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_SHARED, fd, 0);
if (shm_address == MAP_FAILED)
{
perror("Error mmapping the file");
return EXIT_FAILURE;
}
void *temp = mremap(shm_address, size_of_mem, 4000, MREMAP_MAYMOVE);
if(temp == (void*)-1)
{
perror("Error on mremap()");
return EXIT_FAILURE;
}
return 0;
}
#包括
int main()
{
int size_of_mem=1024;
int fd=shm_open(“/myregion”),O_CREAT | O_RDWR,
S|IRWXO | S|IRUSR | S|IWUSR |);
如果(fd==-1)
{
perror(“shm_open中的错误”);
返回退出失败;
}
如果(ftruncate(fd,内存的大小)=-1)
{
perror(“ftruncate中的错误”);
返回退出失败;
}
void*shm\u address=mmap(0,大小为,
PROT|u READ | PROT|u WRITE | PROT|u EXEC,
MAP_共享,fd,0);
如果(shm_地址==映射_失败)
{
perror(“映射文件时出错”);
返回退出失败;
}
void*temp=mremap(shm地址,内存大小,4000,mremap可移动);
如果(临时==(无效*)-1)
{
perror(“mremap()上的错误”);
返回退出失败;
}
返回0;
}
注:
- 正确的数据类型(
),正确检查void*
的错误,使用mremap()
打印更多信息性错误消息,错误路径结束函数的执行peror()
- 正确/一致的缩进
- 函数调用中的
前面没有空格,
- 这里有几件事不对
首先,
mmap()
和mremap()
返回一个void*
指针,不能将其强制转换为int
Second,mremap()
声明:
返回值
成功时,mremap()返回指向新虚拟内存区域的指针。出现错误时,返回值MAP_FAILED(即,(void*)-1),并正确设置errno
所以您的检查temp<0
是错误的。它应该是temp==(void*)-1
。当转换为int时,mremap()
完全可能在成功时返回小于零的有效指针
Third,mmap()
和mremap()
在发生错误时设置errno
()变量。你可以阅读这篇文章来获得更多关于到底哪里出了问题的信息。要仅输出文本错误消息,请使用peror()
函数()。请注意,您必须为此包含
第四个,如果检测到错误情况,则始终打印消息,但通常允许继续执行。那没有道理。如果shm\u open()
失败,您希望立即返回(或调用exit(exit\u FAILURE)
)。如果您甚至无法打开SHM文件,则以下函数都无法工作
因此,我的清理版本如下所示:
#include <error.h>
int main()
{
int size_of_mem = 1024;
int fd = shm_open("/myregion", O_CREAT | O_RDWR,
S_IRWXO | S_IRUSR | S_IWUSR);
if (fd == -1)
{
perror("Error in shm_open");
return EXIT_FAILURE;
}
if (ftruncate(fd, size_of_mem) == -1)
{
perror("Error in ftruncate");
return EXIT_FAILURE;
}
void *shm_address = mmap(0, size_of_mem,
PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_SHARED, fd, 0);
if (shm_address == MAP_FAILED)
{
perror("Error mmapping the file");
return EXIT_FAILURE;
}
void *temp = mremap(shm_address, size_of_mem, 4000, MREMAP_MAYMOVE);
if(temp == (void*)-1)
{
perror("Error on mremap()");
return EXIT_FAILURE;
}
return 0;
}
#包括
int main()
{
int size_of_mem=1024;
int fd=shm_open(“/myregion”),O_CREAT | O_RDWR,
S|IRWXO | S|IRUSR | S|IWUSR |);
如果(fd==-1)
{
perror(“shm_open中的错误”);
返回退出失败;
}
如果(ftruncate(fd,内存的大小)=-1)
{
perror(“ftruncate中的错误”);
返回退出失败;
}
void*shm\u address=mmap(0,大小为,
PROT|u READ | PROT|u WRITE | PROT|u EXEC,
MAP_共享,fd,0);
如果(shm_地址==映射_失败)
{
perror(“映射文件时出错”);
返回退出失败;
}
void*temp=mremap(shm地址,内存大小,4000,mremap可移动);
如果(临时==(无效*)-1)
{
perror(“mremap()上的错误”);
返回退出失败;
}
返回0;
}
注:
- 正确的数据类型(
),正确的错误检查void*
,使用mremap()