我已经编写了以下代码,但代码仍然是我的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 ;
}
答案 0 :(得分:4)
这里有一些问题。
首先,mmap()
和mremap()
返回一个void*
指针,您不能将其转换为int
。
第二次,mremap()
man page州:
返回值
成功时,mremap()返回指向新虚拟内存区域的指针。出错时,返回值MAP_FAILED(即(void *)-1),并正确设置errno。
因此,您的支票temp < 0
是错误的。它应该是temp == (void*)-1
。完全有可能mremap()
在成功时返回一个小于零的有效指针。
第三次,mmap()
和mremap()
都会在发生错误时设置errno
(man page)变量。您可以阅读该内容以获取有关确实出错的更多信息。要输出文本错误消息,请使用perror()
函数(man page)。请注意,您必须#include <errno.h>
。
第四,如果您检测到错误情况,则始终打印一条消息,但您最常允许继续执行。这没有意义。如果shm_open()
失败,您想立即返回(或致电exit(EXIT_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;
}
注意:
void*
),更正mremap()
的错误检查,使用perror()
打印更多信息性错误消息,错误路径结束函数执行。,
之前没有空格。