A memory mapped file is very easy to use as we can perform simple arithmetic operations to get and set data from a file.
Here is a simple example of creating and using memory mapped files.It takes a file and offset as input and tells what data is present at that offset.
//memorymap.c
//To compile : gcc -o mmap memorymap.c
//To run : ./mmap file-name offset
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <errno.h>
int main(int argc, char *argv[])
{
int fd, offset;
char *data;
struct stat sbuf;
if (argc != 3)
{
fprintf(stderr, "usage: %s <file-name> offset\n",argv[0]);
exit(1);
}
if ((fd = open(argv[1], O_RDONLY)) == -1)
{
perror("open");
exit(1);
}
/*argv[1] is the file name to be examined*/
if (stat(argv[1], &sbuf) == -1)
{
perror("stat");
exit(1);
}
offset = atoi(argv[2]);
if (offset < 0 || offset > sbuf.st_size-1)
{
printf("%s: offset must be in the range 0-%d\n",argv[0],sbuf.st_size-1);
exit(1);
}
data = mmap((caddr_t)0, sbuf.st_size, PROT_READ, MAP_SHARED, fd, 0);
{
if (data == (caddr_t)(-1))
{
perror("mmap");
exit(1);
}
printf("Byte at offset %d is '%c'\n", offset, data[offset]);
return 0;
}
}
This also works very efficiently in Java.
ReplyDelete