Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 27 May 2000 11:21:38 -0700 (PDT)
From:      Matthew Dillon <dillon@apollo.backplane.com>
To:        Trent Nelson <tpnelson@echidna.stu.cowan.edu.au>
Cc:        hackers@FreeBSD.ORG
Subject:   Re: Erroneous mmap() behaviour?
Message-ID:  <200005271821.LAA96710@apollo.backplane.com>
References:   <39300E44.558B632F@student.cowan.edu.au>

next in thread | previous in thread | raw e-mail | index | archive | help
:	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));

    It's perfectly acceptable to mmap() a larger space then a file's actual
    size, but you will segfault on any page mapped beyond the file's EOF
    until the file has been extended into it.  

    Writing to an mmap()'d page does NOT extend a file.  Only write() or
    ftruncate() can be used to extend a file.

    The typical way to use mmap() in this fashion is:

	open/create the file
	do the mmap
	ftruncate() the file to the correct number of bytes
	access the mmap

    Some of these operations are interchangeable.    You can ftruncate() the
    file to be larger first, and then mmap, or you can mmap the expected number
    of bytes first, then ftruncate() the file to that size.  What you cannot
    do is *access* any portion of the mmap that is beyond the file's current
    EOF.

						-Matt



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200005271821.LAA96710>