mirror of https://github.com/mkerrisk/man-pages
192 lines
5.1 KiB
Groff
192 lines
5.1 KiB
Groff
.\" (c) 2001 by John Levon <moz@compsoc.man.ac.uk>
|
|
.\" Based in part on GNU libc documentation.
|
|
.\"
|
|
.\" Permission is granted to make and distribute verbatim copies of this
|
|
.\" manual provided the copyright notice and this permission notice are
|
|
.\" preserved on all copies.
|
|
.\"
|
|
.\" Permission is granted to copy and distribute modified versions of this
|
|
.\" manual under the conditions for verbatim copying, provided that the
|
|
.\" entire resulting derived work is distributed under the terms of a
|
|
.\" permission notice identical to this one.
|
|
.\"
|
|
.\" Since the Linux kernel and libraries are constantly changing, this
|
|
.\" manual page may be incorrect or out-of-date. The author(s) assume no
|
|
.\" responsibility for errors or omissions, or for damages resulting from
|
|
.\" the use of the information contained herein. The author(s) may not
|
|
.\" have taken the same level of care in the production of this manual,
|
|
.\" which is licensed free of charge, as they might when working
|
|
.\" professionally.
|
|
.\"
|
|
.\" Formatted or processed versions of this manual, if unaccompanied by
|
|
.\" the source, must acknowledge the copyright and authors of this work.
|
|
.\" License.
|
|
.\"
|
|
.\" 2001-10-11, 2003-08-22, aeb, added some details
|
|
.TH POSIX_MEMALIGN 3 2003-08-22 "GNU" "Linux Programmer's Manual"
|
|
.SH NAME
|
|
posix_memalign, memalign, valloc \- Allocate aligned memory
|
|
.SH SYNOPSIS
|
|
.nf
|
|
.B #define _XOPEN_SOURCE 600
|
|
.B #include <stdlib.h>
|
|
.sp
|
|
.BI "int posix_memalign(void **" memptr ", size_t " alignment ", size_t " size );
|
|
.sp
|
|
.B #include <malloc.h>
|
|
.sp
|
|
.BI "void *valloc(size_t " size );
|
|
.BI "void *memalign(size_t " boundary ", size_t " size );
|
|
.nl
|
|
.fi
|
|
.SH DESCRIPTION
|
|
The function
|
|
.BR posix_memalign ()
|
|
allocates
|
|
.I size
|
|
bytes and places the address of the allocated memory in
|
|
.IR "*memptr" .
|
|
The address of the allocated memory will be a multiple of
|
|
.IR "alignment" ,
|
|
which must be a power of two and a multiple of
|
|
.IR "sizeof(void *)".
|
|
|
|
The obsolete function
|
|
.BR memalign ()
|
|
allocates
|
|
.I size
|
|
bytes and returns a pointer to the allocated memory.
|
|
The memory address will be a multiple of
|
|
.IR "boundary" ,
|
|
which must be a power of two.
|
|
|
|
The obsolete function
|
|
.BR valloc ()
|
|
allocates
|
|
.I size
|
|
bytes and returns a pointer to the allocated memory.
|
|
The memory address will be a multiple of the page size.
|
|
It is equivalent to
|
|
.IR "memalign(sysconf(_SC_PAGESIZE),size)" .
|
|
|
|
For all three routines, the memory is not zeroed.
|
|
|
|
.SH "RETURN VALUE"
|
|
.BR memalign ()
|
|
and
|
|
.BR valloc ()
|
|
return the pointer to the allocated memory, or NULL if the request fails.
|
|
|
|
.BR posix_memalign ()
|
|
returns zero on success, or one of the error values listed in the
|
|
next section on failure. Note that
|
|
.IR errno
|
|
is not set.
|
|
|
|
.SH "ERRORS"
|
|
.TP
|
|
.B EINVAL
|
|
The
|
|
.IR alignment
|
|
parameter was not a power of two, or was not a multiple of
|
|
.IR "sizeof(void *)" .
|
|
.TP
|
|
.B ENOMEM
|
|
There was insufficient memory to fulfill the allocation request.
|
|
|
|
.SH NOTES
|
|
On many systems there are alignment restrictions, e.g. on buffers
|
|
used for direct block device I/O. POSIX specifies the
|
|
.I "pathconf(path,_PC_REC_XFER_ALIGN)"
|
|
call that tells what alignment is needed. Now one can use
|
|
.BR posix_memalign ()
|
|
to satisfy this requirement.
|
|
|
|
.BR posix_memalign ()
|
|
verifies that
|
|
.IR alignment
|
|
matches the requirements detailed above.
|
|
.BR memalign ()
|
|
may not check that the
|
|
.IR boundary
|
|
parameter is correct.
|
|
|
|
POSIX requires that memory obtained from
|
|
.BR posix_memalign ()
|
|
can be freed using
|
|
.BR free ().
|
|
Some systems provide no way to reclaim memory allocated with
|
|
.BR memalign ()
|
|
or
|
|
.BR valloc ()
|
|
(because one can only pass to
|
|
.BR free ()
|
|
a pointer gotten from
|
|
.BR malloc (),
|
|
while e.g.
|
|
.BR memalign ()
|
|
would call
|
|
.BR malloc ()
|
|
and then align the obtained value).
|
|
.\" Other systems allow passing the result of
|
|
.\" .IR valloc ()
|
|
.\" to
|
|
.\" .IR free (),
|
|
.\" but not to
|
|
.\" .IR realloc ().
|
|
GNU libc allows memory obtained from any of these three routines to be
|
|
reclaimed with
|
|
.BR free ().
|
|
|
|
GNU libc
|
|
.BR malloc ()
|
|
always returns 8-byte aligned memory addresses, so these routines are only
|
|
needed if you require larger alignment values.
|
|
|
|
.SH AVAILABILITY
|
|
The functions
|
|
.BR memalign ()
|
|
and
|
|
.BR valloc ()
|
|
have been available in all Linux libc libraries.
|
|
The function
|
|
.BR posix_memalign ()
|
|
is available since glibc 2.1.91.
|
|
|
|
.SH "CONFORMING TO"
|
|
The function
|
|
.BR valloc ()
|
|
appeared in 3.0BSD. It is documented as being obsolete in 4.3BSD,
|
|
and as legacy in SUSv2. It no longer occurs in SUSv3.
|
|
The function
|
|
.BR memalign ()
|
|
appears in SunOS 4.1.3 but not in 4.4BSD.
|
|
The function
|
|
.BR posix_memalign ()
|
|
comes from POSIX 1003.1d.
|
|
|
|
.SH HEADERS
|
|
Everybody agrees that
|
|
.BR posix_memalign ()
|
|
is declared in <stdlib.h>. In order to declare it, glibc needs
|
|
_GNU_SOURCE defined, or _XOPEN_SOURCE defined to a value not less than 600.
|
|
|
|
On some systems
|
|
.BR memalign ()
|
|
is declared in <stdlib.h> instead of <malloc.h>.
|
|
|
|
According to SUSv2,
|
|
.BR valloc ()
|
|
is declared in <stdlib.h>.
|
|
Libc4,5 and glibc declare it in <malloc.h> and perhaps also in <stdlib.h>
|
|
(namely, if _GNU_SOURCE is defined, or _BSD_SOURCE is defined, or,
|
|
for glibc, if _XOPEN_SOURCE_EXTENDED is defined, or, equivalently,
|
|
_XOPEN_SOURCE is defined to a value not less than 500).
|
|
|
|
.SH "SEE ALSO"
|
|
.BR brk (2),
|
|
.BR getpagesize (2),
|
|
.BR free (3),
|
|
.BR malloc (3),
|
|
.BR feature_test_macros (7)
|