gpt4 book ai didi

c++ - 在 Linux 上尝试 write() 大于 2 GB 的文件时出错

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:08:10 25 4
gpt4 key购买 nike

我需要打开一个文件并通过 mmap 将其加载到共享内存中,但如果该文件尚不存在,我想打开它,向其中写入一些(假)数据,然后对其进行 mmap。我在 C 中编写了以下函数,但在写入时出现错误(见下文)。 (我知道mmap部分可能是错误的(数据分配了两次!),但错误发生在这之前,所以它应该不会对这个问题有任何影响。

// These 2 are global so they can be referenced in other functions.
int dfd = -1;
long* data = NULL;

void load_data(char* filename)
{
dfd = open(filename, O_RDONLY);

if (dfd == -1) {

printf("Creating file %s\n", filename);

dfd = open(filename, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR);

if (dfd == -1) {
fprintf(stderr, "Couldn't create file %s\n", filename);
perror("create");
exit(1);
}

data = (long *) valloc(M * GB);

if (data == nullptr) {
fprintf(stderr, "Couldn't allocate %ld bytes", (M * GB));
perror("malloc");
exit(1);
}

for (size_t i = 0; i < M * GB / sizeof(long); ++i)
data[i] = (long) i;

printf("%d %p %ld\n", dfd, data, M * GB);

ssize_t w = write(dfd, (void*) data, M * GB);

if (w != M * GB) {
fprintf(stderr, "Couldn't write %ld bytes to file %s\n", (M * GB), filename);
fprintf(stderr, "Wrote %ld bytes\n", w);
perror("write");
exit(1);
}
}

data = (long *) mmap(0, M * GB, PROT_READ, MAP_SHARED, dfd, 0);

if (data == MAP_FAILED) {
perror("mmap");
exit(1);
}
}

MacOS 64 位、Apple g++ 上的输出和错误:

Creating file bench2_datafile.bin
3 0x101441000 2147483648
Couldn't write 2147483648 bytes to file bench2_datafile.bin
Wrote -1 bytes
write: Invalid argument

有什么指示吗?我一直在阅读打开和写入文档,并在互联网上寻找示例,但我似乎无法克服这个错误。

受益于评论之后:

RHEL 6、g++ 4.8 上的输出:

Creating file bench2_datafile.bin
3 0x7f79048af000 2147483648
write: Success
Couldn't write 2147483648 bytes to file bench2_datafile.bin
Wrote 2147479552 bytes

而 2147479552 确实是 ls 中的文件大小。

此外,它可以在 1 GB 的 Mac 上运行 - 但在 2 GB 时就没劲了。哦,好吧——无论如何,我真正的目标是 Linux,在我解决 bug 之前,在 Mac 上工作更方便:-)

最佳答案

许多平台对文件位置使用 32 位值。此外,接口(interface)要求对值进行签名。这意味着只要您想要处理大于 2 GB 的文件,就会遇到麻烦。

某些平台提供非标准函数来处理较大的文件。

您需要查看平台文档,了解您想要定位的平台的内容。

关于c++ - 在 Linux 上尝试 write() 大于 2 GB 的文件时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38586144/

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