gzopen()导致ENOMEM的原因

时间:2012-06-10 03:05:00

标签: zlib enomem

我有一个程序,其总内存占用量大约为100 MiB(VM大小,在顶部,但在gdb中停止),它正在尝试使用{{打开一个新的(尚未存在的)压缩日志文件1}}。这个失败,gzopen设置为errno,尽管系统有6GB内存完全空闲(甚至没有缓存),文件系统上有很多空间(ENOMEM }, 我知道)。是否有更多模糊的问题可能导致这种情况?库中的某些东西偶然会在千兆字节的内存上分配千兆字节而没有充分的理由吗?

注意,我的ulimits设置为无限制。

2 个答案:

答案 0 :(得分:0)

不,zlib中没有任何内容可以分配超过一两个MiB。 zlib只会将errno设置为零。就其本身而言,它从未将errno设置为ENOMEM。它调用的库函数可能。您使用的是什么版本的zlib?

答案 1 :(得分:0)

原来zlib没有返回ENOMEM。这是因为我们传递了一个模式参数w+,这是无效的,因为它无法同时读取和写入给定的gzip文件。 ENOMEM来自之前的图书馆/系统调用中errno所发生的事情。