gpt4 book ai didi

c - msync 并没有真正将内存同步到文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:06:12 26 4
gpt4 key购买 nike

我正在编写一个简单的 C 程序来反转文件中的字节(仅用于学习目的)。我正在打开我的文件,将其映射到内存中并反转字节顺序。所以第一个变成最后一个,最后一个变成第一个等等。
在内存中一切正常(用 gdb 检查)但是当我同步和取消映射内存时,驱动器上的文件没有改变(字节顺序相同,没有颠倒)。
最糟糕的是我在运行程序时没有出现任何错误。
当然,我是该文件的所有者,它对我来说是可读可写的。

#include <stdio.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <string.h>
#include <fcntl.h>

int main (int argc, char *argv[]){
int fd_in;
int i, j;
char tmp;
struct stat inode;
char *addr_in;

if(argc < 2){
printf("Usage: %s input\n", argv[0]);
return -1;
}

fd_in = open(argv[1], O_RDWR);

if(fd_in == -1){
perror("Error opening file");
return 2;
}

if(fstat(fd_in, &inode)){
perror("fstat error");
}

addr_in = mmap(NULL, inode.st_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd_in, 0);

if(addr_in == (char*)(-1)){
perror("Error mapping memory");
close(fd_in);
return 2;
}

for(i = 0, j = inode.st_size-1; i < inode.st_size ; i++, j--){
tmp = addr_in[i];
addr_in[i] = addr_in[j];
addr_in[j] = tmp;
}
if(msync(addr_in, inode.st_size, MS_SYNC) == -1){
perror("sync error");
return 2;
}
if(munmap(addr_in, inode.st_size) == -1){
perror("unmap error");
return 2;
}
close(fd_in);

}

最佳答案

for(i = 0, j = inode.st_size-1; i < inode.st_size ; i++, j--)

应该是

for(i = 0, j = inode.st_size - 1; i < inode.st_size / 2; i++, j--)

如果你遍历整个数组,你将反转它两次,即。 e.基本上什么都不会发生。

关于c - msync 并没有真正将内存同步到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13117791/

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