- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在编写一个简单的 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/
我想使用 POSIX 共享内存,我的问题是关于调用 mmap(MAP_SHARED)msync() 和 munmap() 的用法. 在不使用 msync() 的情况下,对一个进程的共享内存段所做的更改
我刚刚学习 msync 的使用,但是我遇到了问题段错误。当我将 MAPSTEP 更改为较小的数字时,错误就消失了。这段代码有什么问题? #define MAPSTEP 1 * 4096 main(vo
当使用mmap/msync/munmap时,读/写是原子的吗? (假设磁盘将在断电时完成所有挂起的写入) 最佳答案 涉及多个页面或多个磁盘扇区的操作从来都不是精确的原子操作。 调查两个特定事物之间的一
我正在编写一个简单的 C 程序来反转文件中的字节(仅用于学习目的)。我正在打开我的文件,将其映射到内存中并反转字节顺序。所以第一个变成最后一个,最后一个变成第一个等等。 在内存中一切正常(用 gdb
我在 Linux 中使用 POSIX 函数 mmap()。但是当我执行 msync() 时,它会将缓存缓冲区完全写入文件,还是会以某种方式在某处记录哪些页面已更改,哪些页面未更改,并且写入文件仅更改
我正在对映射文件进行许多小的随机写入。我想确保一致性,因此有时会使用 msync,但我不想跟踪我所做的每一个小写入。在当前的 Linux 内核实现中,对整个文件使用 msync 是否会造成性能损失?例
Windows 中的 msync [unix sys call] 等价物是什么?我正在寻找 C、C++ 空间中的 MSDN api。有关 msync 的更多信息,请访问 http://opengrou
已阅读 manual msync的,我认为MS_INVALIDATE的确切含义如下: 假设有p1、p2、p3三个进程。 p1 和 p2 都使用 mmap 和 MAP_SHARED 同时读写文件 /tm
已阅读 manual msync的,我认为MS_INVALIDATE的确切含义如下: 假设有p1、p2、p3三个进程。 p1 和 p2 都使用 mmap 和 MAP_SHARED 同时读写文件 /tm
我在使用msync时遇到一个问题。非常感谢您的帮助! 简而言之,我映射文件A,并修改它和msync,但st_mtime没有改变。即使munmap文件A并退出进程,st_mtime也不变。 以下是代码。
我有两个上下文,即 process1 和 process2 共享相同的映射区域,process1 大多数时候将数据同步到文件,而 process2 只在系统重新启动之前同步一次以确保所有数据都已同步。
是否保证在 linux 上使用 msync(MS_ASYNC) 刷新页面的顺序与写入页面的顺序相同? 如果视情况而定,我(完全服务器访问权限)是否有办法确保它们的顺序相同? 背景 我目前正在使用 Op
如果我在内存映射区域上使用 MS_ASYNC 调用 msync,同步过程将被异步处理。 但是,如果我立即对该区域调用 munmap,我是否可以假设 msync 将安全执行?或者我必须在 munmap
我在 Linux 2.6 上的应用程序中使用 msync 以确保在发生崩溃时的一致性。我需要彻底测试我对 msync 的使用,但实现似乎正在为我刷新所有相关页面。有没有一种方法可以防止将 mmap 页
我想使用 mmap 在 Linux 下运行的 C 程序中实现程序状态某些部分的持久化,方法是使用带有 MAP_SHARED 标志集的 mmap() 将固定大小的结构与众所周知的文件名相关联。出于性能原
据我所知,在大多数日志模式为“data=ordered”的ext3系统上,fsync不仅会同步fd指定的文件,还会同步文件系统上的所有文件,而且这个问题还没有被修复内核 2.6.30 之前 我有一个问
我正在使用 mmap 打开/dev/mem 以读/写 UART 寄存器。它运作良好,但我的问题是:写入后,是否真的需要带有 MS_SYNcflags的 msync 系统调用? 根据我的理解,/dev/
下午好,我们正在为 Centos Linux Release x86_32 和 Microsoft Windows 构建原型(prototype)去重器。原型(prototype)的一部分是使用 18
我通过 C API 使用 RocksDB。 我有一个测试程序,它打开数据库,执行 1,000 次写入(收集启动写入和回调之间的计时数据),执行 1,000 次读取,然后关闭。 这有效。平均写入时间约为
我是一名优秀的程序员,十分优秀!