mremap函数无法分配新内存

时间:2014-04-20 08:30:32

标签: c shared-memory mmap

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

1 个答案:

答案 0 :(得分:4)

这里有一些问题。

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

第二次mremap() man page州:

  

返回值

     

成功时,mremap()返回指向新虚拟内存区域的指针。出错时,返回值MAP_FAILED(即(void *)-1),并正确设置errno。

因此,您的支票temp < 0是错误的。它应该是temp == (void*)-1。完全有可能mremap()在成功时返回一个小于零的有效指针。

第三次mmap()mremap()都会在发生错误时设置errnoman 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()打印更多信息性错误消息,错误路径结束函数执行。
  • 正确/一致的缩进。
  • 函数调用中,之前没有空格。