gpt4 book ai didi

c - 为什么我的程序不能将大量 (>2GB) 保存到文件中?

转载 作者:太空宇宙 更新时间:2023-11-04 04:54:08 26 4
gpt4 key购买 nike

我无法弄清楚为什么我的程序不能将超过 2GB 的数据保存到一个文件中。我无法判断这是编程问题还是环境 (OS) 问题。这是我的源代码:

#define _LARGEFILE_SOURCE
#define _LARGEFILE64_SOURCE
#define _FILE_OFFSET_BITS 64
#include <math.h>
#include <time.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*-------------------------------------*/
//for file mapping in Linux
#include<fcntl.h>
#include<unistd.h>
#include<sys/stat.h>
#include<sys/time.h>
#include<sys/mman.h>
#include<sys/types.h>
/*-------------------------------------*/
#define PERMS 0600
#define NEW(type) (type *) malloc(sizeof(type))
#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)

void write_result(char *filename, char *data, long long length){

int fd, fq;

fd = open(filename, O_RDWR|O_CREAT|O_LARGEFILE, 0644);

if (fd < 0) {
perror(filename);
return -1;
}

if (ftruncate(fd, length) < 0)
{
printf("[%d]-ftruncate64 error: %s/n", errno, strerror(errno));
close(fd);
return 0;
}

fq = write (fd, data,length);

close(fd);

return;

}

main()
{
long long offset = 3000000000; // 3GB
char * ttt;
ttt = (char *)malloc(sizeof(char) *offset);
printf("length->%lld\n",strlen(ttt)); // length=0
memset (ttt,1,offset);
printf("length->%lld\n",strlen(ttt)); // length=3GB
write_result("test.big",ttt,offset);
return 1;
}

根据我的测试,程序可以生成大于2GB的文件,也可以分配这么大的内存。当我试图将数据写入文件时,奇怪的事情发生了。我检查了文件,它是空的,应该用1填充。

谁能好心帮我解决这个问题?

最佳答案

您需要阅读更多关于 C 字符串以及 malloccalloc 做什么的内容。

在您原来的 main 中,ttt 指向调用 malloc 时内存中的任何垃圾。这意味着 nul 终止符(C 字符串的结束标记,二进制 0)可以位于 malloc 返回的垃圾中的任何位置。

此外,由于 malloc 不会触及已分配内存的每个字节(并且您要求很多),您可能会获得稀疏内存,这意味着内存在物理上实际上不可用,直到它被分配阅读或写作。

calloc 分配并用 0 填充分配的内存。因此它更容易失败(它触及分配的每个字节,所以如果操作系统离开分配稀疏它不会在 calloc 填充后稀疏。)

这是您修复上述问题的代码。您还应该始终检查 write 的返回值并做出相应的 react 。我会把它留给你......

main(){    long long offset = 3000000000; // 3GB    char * ttt;    //ttt = (char *)malloc(sizeof(char) *offset);    ttt = (char *)calloc( sizeof( char ), offset ); // instead of malloc( ... )    if( !ttt )    {        puts( "calloc failed, bye bye now!" );        exit( 87 );    }    printf("length->%lld\n",strlen(ttt));  // length=0  (This now works as expected if calloc does not fail)    memset( ttt, 1, offset );    ttt[offset - 1] = 0;  // Now it's nul terminated and the printf below will work    printf("length->%lld\n",strlen(ttt));  // length=3GB    write_result("test.big",ttt,offset);    return 1;}

Linux 专家请注意...我知道稀疏可能不是正确的术语。如果我错了,请纠正我,因为自从我被埋没在 Linux 细节中以来已经有一段时间了。 :)

关于c - 为什么我的程序不能将大量 (>2GB) 保存到文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11169202/

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