gpt4 book ai didi

无法使用 mmap/malloc/open 等在 64 位 linux 系统上创建大于 2GB 的文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:58:35 27 4
gpt4 key购买 nike

好吧,我知道以前以各种形式提出过这样的问题,我已经阅读了所有这些问题并尝试了所有建议的方法,但我仍然无法使用 malloc 在 64 位系统上创建超过 2GB 的文件,打开, lseek,blah blah 太阳底下的每一个把戏。

很明显我在这里写了c。我正在运行 Fedora 20,我实际上是在尝试映射文件,但这不是它失败的地方,我原来的方法是使用 open(),然后 lseek 到文件应该结束的位置,在这种情况下是在3GB,编辑:然后在文件结束位置写入一个字节来实际创建该大小的文件,然后mmap该文件。我不能超过 2GB。我也不能 malloc 超过 2GB。 ulimit -a 等都显示无限制,/etc/security/limits.conf 什么都不显示,....

当我尝试 lseek 超过 2GB 时,我得到 errno 的 EINVAL 并且 lseek 的 ret val 是 -1.edit:lseek 的 size 参数是 off_t 类型,它被定义为 long int(64 位有符号),而不是 size_t正如我之前所说。

编辑:我已经尝试定义 _LARGEFILE64_SOURCE & _FILE_OFFSET_BITS 64 并且没有任何区别。我也在专门为 64 位编译,即 -m64

我迷路了。我不知道为什么我不能这样做。

如有任何帮助,我们将不胜感激。

谢谢。

编辑:我已经删除了很多完全不正确的胡言乱语和其他一些后来处理过的不重要的废话。

我的 2GB 问题在于多种不同类型的交换非常草率。有符号和无符号的混合是问题所在。本质上,我传递给 lseek 的 3GB 位置被解释/转换为 -1GB 的位置,显然 lseek 不喜欢那样。所以我不好。完全愚蠢。

我将按照 p_l 的建议改为使用 posix_fallocate()。虽然它确实删除了一个函数调用,即只需要 posix_fallocate 而不是 lseek 然后写,但对我来说这并不重要,事实上 posix_fallocate 正在做我想直接做的事情,而 lseek 方法没有。因此,特别感谢 p_l 的建议,并特别感谢 NominalAnimal,他更了解他的坚持间接让我意识到我无法计数,这反过来又让我接受 posix_fallocate 会起作用,因此改用它。

无论我使用哪种结束方法。 2GB 的问题完全是我自己的废话编码,再次感谢 EOF、chux、p_l 和 Jonathon Leffler,他们都提供了信息和建议,让我找到了我自己创造的问题。

我在答案中包含了一个较短的版本。

最佳答案

我的 2GB 问题在于多种不同类型的交换非常草率。有符号和无符号的混合是问题所在。本质上,我传递给 lseek 的 3GB 位置被解释/转换为 -1GB 的位置,显然 lseek 不喜欢那样。所以我不好。完全愚蠢的废话编码。

再次感谢 EOF、chux、p_l 和 Jonathon Leffler,他们都提供了信息和建议,使我找到了我创建的问题及其解决方案。

再次感谢 p_l 推荐 posix_fallocate(),特别感谢 NominalAnimal,他的坚持间接让我意识到我无法计数,这反过来又让我接受 posix_fallocate 可以工作,所以改为使用它。

@p_l 虽然我的实际问题的解决方案不在您的答案中,但我仍然会投票给您建议使用 posix_fallocate 的答案,但我没有足够的分数来做到这一点。

关于无法使用 mmap/malloc/open 等在 64 位 linux 系统上创建大于 2GB 的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23037130/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com