posix_memalign - ライブラリコールの説明 - Linux コマンド集 一覧表
- 名前
- 書式
- 説明
- 返り値
- エラー
- 注意
- 可用性
- 準拠
- ヘッダ
- 関連項目
名前
posix_memalign, memalign, valloc - アラインメントされたメモリの割り当てを行う
書式
#define _XOPEN_SOURCE 600#include <stdlib.h>
int posix_memalign(void **memptr, size_t alignment, size_t size);
#include <malloc.h>
void *valloc(size_t size);void *memalign(size_t boundary, size_t size);
説明
関数
posix_memalign
()は
size
バイトのメモリを割り当て、割り当てられたメモリのアドレスを
*memptr
に設定する。
割り当てられたメモリのアドレスは
alignment
の倍数になっているはずである。
alignment
は 2 のべき乗で、かつ
sizeof(void *)
の倍数でなければならない。
廃止された関数である
memalign
()は、
size
バイトのメモリを割り当て、割り当てられたメモリへのポインタを返す。
メモリのアドレスは
boundary
の倍数になっているはずである。
boundary
は 2 のべき乗でなければならない。
廃止された関数である
valloc
()は
size
バイトのメモリを割り当て、割り当てられたメモリへのポインタを返す。
メモリのアドレスはページサイズの倍数になっているはずである。
これは
memalign(sysconf(_SC_PAGESIZE),size)
と等価である。
3 つの関数はいずれもメモリのゼロクリアを行わない。
返り値
memalign
()と
valloc
()は割り当てられたメモリへのポインタを返す。
割り当てに失敗した場合は NULL を返す。
posix_memalign
()は成功した場合は 0 を返し、
失敗した場合は次のセクションに記載されたエラー値のいずれかを返す。
errno
はセットされないことに注意すること。
エラー
-
EINVAL
-
alignment
パラメータが 2 のべき乗でなかったか、
sizeof(void *)
の倍数でなかった。
-
ENOMEM
-
割り当て要求を満たすのに十分なメモリがなかった。
注意
多くのシステムでは、アラインメントに関して制限がある。例えば、
ブロックデバイスに対するダイレクト I/O に使用するバッファには
アラインメントに関する制限がある。
POSIX では、どんなアラインメントが必要かを知るために
"pathconf(path,_PC_REC_XFER_ALIGN)"
コールを規定している。ここで
posix_memalign
()を使うと、この必要条件を満たすことができる。
posix_memalign
()は
alignment
が上で詳細に述べた必要条件を満たすかどうかを確かめる。
memalign
()は
boundary
パラメータが正しいかどうかの確認を行わないかもしれない。
POSIX では
posix_memalign
()によって獲得したメモリは
free
()を使って解放することができる必要がある。
いくつかのシステムでは
memalign
()や
valloc
()で割り当てられたメモリを再利用する手段が提供されていない。
(なぜなら
free
()に渡すことができるのは
malloc
()から受け取ったポインタだけだが、
例えば
memalign
()は
malloc
()を呼び出し、得た値をアラインメントしてしまうからである)
GNU libc では
ここに述べた 3 つの関数のいずれで獲得したメモリも
free
()で再利用することができる。
GNU libc の
malloc
()は常に 8 バイトにアラインメントされたメモリアドレスを返すので、
ここで述べた関数が必要になるのは
8 バイトよりも大きなアラインメントが必要な場合だけである。
可用性
memalign
()と
valloc
()はすべての Linux libc ライブラリで使用可能である。
posix_memalign
()は glibc 2.1.91 以降で使用可能である。
準拠
関数
valloc
()は 3.0BSD で登場した。4.3BSD では廃止されたと記載されており、
SUSv2 では過去のものだと記載されている。
POSIX.1-2001 にはもはや存在しない。
関数
memalign
()は SunOS 4.1.3 で登場したが、4.4BSD にはない。
関数
posix_memalign
()は POSIX.1d に由来する。
ヘッダ
posix_memalign
()の宣言を <stdlib.h> で行うことに関しては、皆の意見が一致している。
この関数を宣言するには、 glibc では _GNU_SOURCE を定義する、または
_XOPEN_SOURCE を 600 より小さくない値に定義する、のいずれかを行う
必要がある。
いくつかのシステムでは、
memalign
()は <malloc.h> ではなく <stdlib.h> で宣言されている。
SUSv2 によると、
valloc
()は <stdlib.h> で宣言される。
libc4,5 や glibc では <malloc.h> で宣言されており、
さらに <stdlib.h> でも宣言されることもある
(具体的には以下のいずれかの場合:
_GNU_SOURCE が定義されている、_BSD_SOURCE が定義されている、
glibc で _XOPEN_SOURCE_EXTENDED が定義されている、
glibc で _XOPEN_SOURCE が 500 より小さくない値に定義されている)。
関連項目
- Linux Tips 関連記事
- Linux Tips(目次)
- Linux ディストリビューション一覧
- rpm のファイル名にあるi386とかi686とは
- 自分のマシンの情報を調べる
- cron の設定
- ssh の root ログインを禁止する
- ssh を、ユーザ、IPでアクセス制限
- 鍵交換方式によるssh接続
- 鍵交換方式によるssh接続( windowsから )
- 複数ファイル内の文字列を置換して上書き保存する
- あるグループをイニシャルグループとするユーザー一覧出力
- 複数ファイルのファイル名を一括変換する
- 連番ファイルをコマンド一発で作成する
- 中身がランダムなファイルを任意のサイズで作成する
- Linux ユーザーアカウントをロック・アンロックする