#include #include #include #include #include #include #include #include #include #include #include /* 1) open() a file over an ext3 filesystem 2) mmap() the file with the MAP_SHARED flag 3) Write records to some areas of the memory mapped file. Records may be less than a page in size or span multiple pages 4) msync(... , 0) the memory area that was modified (see note below) */ /* This file should be on ext3 */ #define FILENAME "/tmp/file.img" #define FILESIZE 4096 #define SLEEPTIME 300 int main(void) { int fd, pagesize; int counter; struct tm *ptr; time_t tm; char *data; char *tmp; pagesize = getpagesize(); printf("Starting msync test\n"); /* 1) open() a file over an ext3 filesystem */ if ((fd = open(FILENAME, O_RDWR|O_CREAT)) == -1) { perror("open"); exit(1); } /* Lets artificially create a large file */ lseek(fd, FILESIZE * 1024, SEEK_SET ) ; /* 2) mmap() the file with the MAP_SHARED flag */ if ((data = mmap(NULL , pagesize * 1024 , PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0)) == NULL) { perror("mmap"); exit(1); } lseek(fd, 0, SEEK_SET) ; /* For troubleshooting, we need to find the time */ tm = time(NULL); ptr = localtime(&tm); tmp = asctime(ptr); /* 3) Write records to some areas of the memory mapped file. Records may be less than a page in size or span multiple pages */ memcpy(data, tmp, strlen(tmp) ); // <- in this case its way less than a page. /* 4) msync(... , 0) the memory area that was modified */ /* Lets sync a full page size */ if (-1 == msync(data, pagesize , 0 )) { perror("msync"); exit(1); } sleep(SLEEPTIME); close(fd); printf("Finishing msync test\n"); printf("Test case should have rebooted the system and you probably shouldnt see this"); return 0; }