Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C mremap函数无法分配新内存_C_Shared Memory_Mmap - Fatal编程技术网

C mremap函数无法分配新内存

C 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

我已经写了下面的代码,但是代码仍然是fivenme
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()
        ,使用