gpt4 book ai didi

c - 在 32 位系统上寻找非常大的文件

转载 作者:太空狗 更新时间:2023-10-29 15:28:23 24 4
gpt4 key购买 nike

<分区>

我目前正在与一个在 32 位 (x86) 机器上运行的 C 程序打一场小仗,涉及 seek

具体来说,我似乎无法超越看似相当任意的文件偏移量。

如果我这样做:

unsigned long long pos = 15032385535LLU;
int r = fseek(fd, pos, SEEK_SET);

那我就去

fstat64(3, {st_mode=S_IFREG|0644, st_size=1000000000000, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77c3000
_llseek(3, 2147479552, [2147479552], SEEK_SET) = 0
read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4095) = 4095

TL;DR 它有效。

但是,如果我将 pos 增加 1...

unsigned long long pos = 15032385536LLU;
int r = fseek(fd, pos, SEEK_SET);

...然后一切都崩溃了:

fstat64(3, {st_mode=S_IFREG|0644, st_size=1000000000000, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb771e000
_llseek(3, 18446744071562067968, 0xbfd0f5f8, SEEK_SET) = -1 EINVAL (Invalid argument)

我完全不知道为什么。我做错了什么?

我能想出的唯一重要花絮是 1503238553537FFFFFFF 这看起来很有趣,还有一个事实是数字 seems to be related to time wraparound .

有问题的程序是用 -D_FILE_OFFSET_BITS=64 编译的,事实证明这有助于实际打开我正在处理的大文件,但似乎没有在这里做出有用的改变。我偶然发现了 -DLARGEFILES -D_LARGEFILE_SOURCE 并尝试添加它,但这似乎没有任何明显的效果。

对于上下文(因为琐事很有趣):我使用 truncate 创建了一个大型稀疏文件,以在单独的 32 位机器上(完美地)重现该问题;有问题的程序是一个小型网络服务器 - 我正试图从一台备用计算机上复制一些数据,我发现很难找到一个可以处理 范围: 请求和同时下载。 nginx 正在抛出 Perl 错误我不打算调查(Slackware 打包问题 - 不),Python 的 SimpleHTTPServer 简单得没用,thttpd 溶解在一堆 mmap 错误中。有趣的一天...

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