Can someone explain to me why mmap() returns an address map you're
prohibited from accessing if the fd argument represents a file that has
just been created?

        I have a function that calls the following, where name represents a
file that, if it exists, is intended to get written over, and if it
doesn't exist, is intended to get created: 
                open(name,
                     (O_RDWR | O_CREAT | O_TRUNC),
                     (S_IRUSR | S_IWUSR));

        What I'm trying to do on return of this fd is, pass it through mmap()
and allocate a certain amount of memory to encapsulate some data I need
to put there - then calling msync() to have the memory buffer flushed
back to disk.

        The mmap() call is:

248:    mksd->msize_db = align(mksd->fsize_db);
249:    mksd->mmap_db = mmap(NULL,
                             mksd->msize_db,
                             (PROT_READ | PROT_WRITE),
                             MAP_PRIVATE,
                             mksd->fd_db,
                             NULL);

        If the file exists (size irrespective), then the following happens,
which is what we want:

bash-2.03$ ls -la database.dat
-rw-------  1 tnelson  tnelson  0 May 27 23:59 database.dat

bash-2.03$ gcc -g -o mksigdata mksd-2.c file_sigs.o
bash-2.03$ gdb mksigdata
[...]
(gdb) break 249
Breakpoint 1 at 0x8048df7: file mksd-2.c, line 249.
(gdb) run files.dat database.dat

Breakpoint 1, write_database (mksd=0xbfbffb50) at mksd-2.c:249
249         mksd->mmap_db = mmap(NULL,
(gdb) n
255         if ((int)mksd->mmap_db == -1)
(gdb) display *mksd
1: *mksd = {file_list = {files = 0x280f3000, history = 0x804d030, size =
[...]
  mmap_db = 0x280f4000}
            ^^^^^^^^^^ This is what we're after.

(Check the validity of the returned memory)
(gdb) x/4 0x280f4000
0x280f4000:     0x00000000      0x00000000      0x00000000      0x00000000

        So, it all works fine. As soon as the file is removed and it has to be
created, though:

bash-2.03$ rm database.dat
bash-2.03$ gdb mksigdata
[...]
  mmap_db = 0x280f4000}
(gdb) x/4 0x2980f4000
0x280f4000:     Error accessing memory address 0x280f4000: Bad address.

        Which is where my problem lies.

        Is it me, or mmap()? If it's me, is there any better way of doing what
I want to do? (which is essentially allocating memory to be modified,
then sync'd to a most probably newly-created file).

        From what I can see, the code works as it should in Linux.

        Thanks in advance.

        Regards,

                Trent.


To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message

Reply via email to