cmmap

use mmap in C to write into memory.


I want to use mmap() to create a file containing some integers. I want to write to this file by writing to memory. I know that the data in memory is binary format and hence the data in file will also be in binary. Can I use mmap for this purpose? where can I find good resources on how to use mmap? I didn't find a good manual to start with.


Solution

  • Here is an example:

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <sys/mman.h> /* mmap() is defined in this header */
    #include <fcntl.h>
    #include <stdio.h>
    
    void err_quit(char *msg)
    {
        printf(msg);
        return 0;
    }
    
    int main (int argc, char *argv[])
    {
     int fdin, fdout;
     char *src, *dst;
     struct stat statbuf;
     int mode = O777;
    
     if (argc != 3)
       err_quit ("usage: a.out <fromfile> <tofile>");
    
     /* open the input file */
     if ((fdin = open (argv[1], O_RDONLY)) < 0)
       {printf("can't open %s for reading", argv[1]);
        return 0;
       }
    
     /* open/create the output file */
     if ((fdout = open (argv[2], O_RDWR | O_CREAT | O_TRUNC, mode )) < 0)//edited here
       {printf ("can't create %s for writing", argv[2]);
        return 0;
       }
    
     /* find size of input file */
     if (fstat (fdin,&statbuf) < 0)
       {printf ("fstat error");
        return 0;
       }
    
     /* go to the location corresponding to the last byte */
     if (lseek (fdout, statbuf.st_size - 1, SEEK_SET) == -1)
       {printf ("lseek error");
        return 0;
       }
     
     /* write a dummy byte at the last location */
     if (write (fdout, "", 1) != 1)
       {printf ("write error");
         return 0;
       }
    
     /* mmap the input file */
     if ((src = mmap (0, statbuf.st_size, PROT_READ, MAP_SHARED, fdin, 0))
       == (caddr_t) -1)
       {printf ("mmap error for input");
        return 0;
       }
    
     /* mmap the output file */
     if ((dst = mmap (0, statbuf.st_size, PROT_READ | PROT_WRITE,
       MAP_SHARED, fdout, 0)) == (caddr_t) -1)
       {printf ("mmap error for output");
        return 0;
       }
    
     /* this copies the input file to the output file */
     memcpy (dst, src, statbuf.st_size);
     return 0;
    
    } /* main */  
    

    From Here
    Another Linux example
    Windows implementation of memory mapping.