gpt4 book ai didi

c - 通过mmap写入文件,但是当我使用fread时,第二次读取错误数据

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

当我用mmap和memcpy写一个文件,然后我用fread读数据的时候。下面是我的代码,问题是第一次我可以读取a,但第二次我无法读取a。我猜 fread 函数中有类似 seek position 的东西,当我使用 memcpy 写文件时,它可能会改变 seek position。

#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <unistd.h>

int main()
{


int fd = open("./aa", O_CREAT | O_RDWR | O_TRUNC, 0644);
FILE* f = fopen("./aa", "r");
if (ftruncate(fd, 1024) < 0) {
printf("ftruncate error\n");
}
void* base;
if ((base = mmap(NULL, 1024, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED) {
printf("mmap error\n");
}
char* file_ptr = (char *)base;
char buffer[256];
char scratch[256];
buffer[0] = 'a';
memcpy(file_ptr, buffer, 1);
file_ptr += 1;
size_t n = fread(scratch, 1, 1, f);
printf("size n %zu\n", n); // this output size n 1
printf("scratch %c\n", scratch[0]); // this output scratch a
memcpy(file_ptr, buffer, 1);
file_ptr += 1;
n = fread(scratch, 1, 1, f);
printf("size n %zu\n", n); // this output size n 1
printf("scratch %c\n", scratch[0]); // but this output scratch
return 0;
}

输出是:尺寸 n 1刮一个尺寸 n 1从头开始

最佳答案

首先,@wildplasser 是对的,您的程序可能会运行,但是如果您继续混合使用 mmap 和 stdio,您将需要确保通过 mmap 完成的写入得到提交(使用msync() 函数)并且 fread 不会缓冲陈旧数据(fseek()ing 到当前位置应该可以解决问题)。

关于您的问题:您的程序不打印“scratch”,而是打印“scratch\0”:)

说真的,你所做的是通过ftruncate()初始化“aa”文件的size,这相当于将缺失的字节填充到1024'\0';你写一个'a',然后读它;然后你读另一个字符,你得到一个 NUL。

尝试打印 scratch[0] 的 ascii 字符,你会看到它是零;如果您仍然不相信,请尝试添加类似内容

for(i = 0; i < 6; i++)
file_ptr[i] = "QWERTY"[i];

就在第一个 memcpy 之前,看看会发生什么。

关于c - 通过mmap写入文件,但是当我使用fread时,第二次读取错误数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23978142/

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