【问题标题】:Causes of gzopen() leading to ENOMEMgzopen() 导致 ENOMEM 的原因
【发布时间】:2013-03-06 04:06:19
【问题描述】:

我有一个程序,其总内存占用约为 100 MiB(VM 大小,在顶部,而在 gdb 中停止),它试图使用 gzopen 打开一个新的(尚不存在的)压缩日志文件。这失败了,errno 设置为ENOMEM,尽管系统有 6GB 内存完全可用(甚至没有缓存),并且文件系统上有很多空间(我知道那将是ENOSPC)。是否有更模糊的问题可能导致这种情况?库中的某些东西是否无缘无故地在千兆字节的内存上分配千兆字节?

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

【问题讨论】:

    标签: zlib enomem


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      原来 zlib 没有返回 ENOMEM。它之所以退出是因为我们向它传递了一个模式参数w+,这是无效的,因为它不能同时读取和写入给定的 gzip 文件。 ENOMEM 来自之前的库/系统调用中恰好位于 errno 中的内容。

      【讨论】:

        猜你喜欢
        • 2011-09-19
        • 2012-07-05
        • 2018-08-04
        • 1970-01-01
        • 1970-01-01
        • 2019-03-17
        • 2012-06-19
        • 2023-03-27
        • 1970-01-01
        相关资源
        最近更新 更多