Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.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++ 用于内存映射文件的Solaris mmap因ENOMEM而失败_C++_C_Memory Management_Mmap_Enomem - Fatal编程技术网

C++ 用于内存映射文件的Solaris mmap因ENOMEM而失败

C++ 用于内存映射文件的Solaris mmap因ENOMEM而失败,c++,c,memory-management,mmap,enomem,C++,C,Memory Management,Mmap,Enomem,在Solaris 10和Linux上,我使用mmap调用创建内存映射文件,然后从单独的进程读取该文件。对于大内存映射文件,在读取(无写入)过程中,我得到ENOMEM。原因可能是什么?补救措施或前进方向可能是什么?我认为内存映射文件并没有完全占用内存 我正在使用以下呼叫: char * segptr = (char *) mmap(0,sz,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0); 其中,sz是文件大小,fd是通过open打开的文件的文件描述符 我在尝试为

在Solaris 10和Linux上,我使用mmap调用创建内存映射文件,然后从单独的进程读取该文件。对于大内存映射文件,在读取(无写入)过程中,我得到ENOMEM。原因可能是什么?补救措施或前进方向可能是什么?我认为内存映射文件并没有完全占用内存

我正在使用以下呼叫:

char * segptr = (char *) mmap(0,sz,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);
其中,
sz
是文件大小,
fd
是通过open打开的文件的文件描述符

我在尝试为整个系统保留空间时遇到了ENOMEM故障

ulimit-a
显示:

core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
open files                      (-n) 256
pipe size            (512 bytes, -p) 10
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 29995
virtual memory          (kbytes, -v) unlimited
我可以映射部分文件吗?如果我打开部分文件,那么我可以按需访问全部内容吗?我没有设置任何限制,所以我想,使用默认值(不知道默认值是什么),我应该增加吗?请导游。
如何将文件映射成更小的块,以节省内存的过度使用,从而避免使用ENOMEM?

使用什么
mmap()
标志?它的价值是什么<当当前进程“没有足够的连续可用地址空间进行映射(例如,在32位进程和类似进程中,映射不能超过2GB)时,也会返回code>ENOMEM。解决方法通常是:不要一次映射整个文件。@dhke编辑了我的Qs
如何映射部分文件?
——您可以通过在
mmap
调用中调整大小(
sz
)和偏移量(最后一个参数为
mmap
)来映射文件区域。另外,请区分内存和地址空间,它们施加了不同的限制。请检查
ulimit-a
的输出、最大内存大小和虚拟内存。@dhke:我的解决方案通常是“使用64位操作系统,现在是2017年,虚拟地址空间实际上是无限的!”