1
我正在寫一個簡單的C程序來反轉文件中的字節(僅用於學習目的)。我正在打開我的文件,將它映射到內存中並反轉字節順序。所以第一個變成最後一個,最後一個變成第一個,等等。
在內存中一切工作正常(使用gdb檢查它)但是當我同步和取消映射內存驅動器上的文件沒有被改變(字節是在相同的順序,而不是顛倒)。
最糟糕的部分是我在運行程序時沒有遇到任何錯誤。
當然,我是該文件的所有者,它對我來說是可讀寫的。msync沒有真正將內存同步到文件
#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);
}
謝謝,你的回答幾乎是正確的。除了我不需要分割j變量的值,只有循環條件。 – xartii
@xartii並放鬆謝謝。 – 2012-10-29 08:33:18
因爲只要'i