gpt4 book ai didi

c - mremap 函数分配新内存失败

转载 作者:太空宇宙 更新时间:2023-11-04 06:28:32 24 4
gpt4 key购买 nike

我已经写了下面的代码,但是代码仍然给我发送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 ;
}

最佳答案

这里有一些错误。

首先mmap()mremap()返回 void*指针,您不能将其强制转换为 int .

其次mremap() man page状态:

RETURN VALUE

On success mremap() returns a pointer to the new virtual memory area. On error, the value MAP_FAILED (that is, (void *) -1) is returned, and errno is set appropriately.

所以你的支票temp < 0是错的。应该是temp == (void*)-1 . mremap() 完全有可能成功时返回一个有效指针,该指针在转换为 int 时小于零。

第三,两者都是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() 的用法打印更多信息错误消息,结束函数执行的错误路径。
  • 正确/一致的缩进。
  • , 前没有空格在函数调用中。

关于c - mremap 函数分配新内存失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23180060/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com