anonymous memory mapping

Ben Caradoc-Davies ben at
Tue Mar 21 00:03:44 CET 2006

Fabiano Sidler wrote:
> 2006/3/14, Fabiano Sidler <fabianosidler at>:
>>Ok, sorry! I wanted to do this:
>>--- snip ---
>>from mmap import mmap, MAP_ANONYMOUS
>>mm = mmap(-1, 1024, MAP_ANONYMOUS)
>>--- snap ---
>>But I got an EnvironmentError, "[Errno 22] Invalid argument" (on
>>Linux2.6, btw.). The reason why I want to use anonymous mapping is
>>that it only allocates the memory it actually uses.
> Hello? Nobody out there who can answer this question?

 From the Linux mmap(2) man page:

"You must specify exactly one of MAP_SHARED and MAP_PRIVATE."

 From the /usr/include/bits/mman.h:
/* Sharing types (must choose one and only one of these).  */
#define MAP_SHARED      0x01            /* Share changes.  */
#define MAP_PRIVATE     0x02            /* Changes are private.  */
/* ... later ... */
# define MAP_ANONYMOUS  0x20            /* Don't use a file.  */

The problem is that python mmap defaults to MAP_SHARED, but when you 
pass in (only) MAP_ANONYMOUS as the access parameter, you are silently 
unsetting the MAP_SHARED bit and not setting the MAP_PRIVATE bit. Linux 
wants to know which you want.

With Python 2.4 on Linux 2.6, both work:

m1 = mmap(-1, 1024, MAP_ANONYMOUS|MAP_PRIVATE)  # no error
m2 = mmap(-1, 1024, MAP_ANONYMOUS|MAP_SHARED)  # no error

Ben Caradoc-Davies <ben at>
"Those who deny freedom to others deserve it not for themselves."
- Abraham Lincoln

More information about the Python-list mailing list