PTHREAD_ATTR_SETGUARDSIZE

Section: Linux Programmer's Manual (3)
Updated: 2020-06-09
Index JM Home Page
 

名前

pthread_attr_setguardsize, pthread_attr_getguardsize - スレッド属性オブジェクトの guard size 属性の設定/取得を行う  

書式

#include <pthread.h>

int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);
int pthread_attr_getguardsize(const pthread_attr_t *attr,
                              size_t *guardsize);

-pthread でコンパイルしてリンクする。
 

説明

pthread_attr_setguardsize() 関数は、 attr が参照するスレッド属性オブジェクトの guard size 属性を guardsize で指定された値に設定する。

guardsize が 0 より大きい場合、 attr を使って新しく作成された各スレッドに対して、 システムはスレッドのスタックの末尾に少なくとも guardsize バイトの 追加領域を割り当てる。この追加領域はスタックに対するガード領域として 機能する (ただし「バグ」の節も参照)。

guardsize が 0 の場合、 attr を使って新しく作成されたスレッドはガード領域を持たない。

デフォルトの guard size はシステムのページサイズと同じである。

(pthread_attr_setstack(3) や pthread_attr_setstackaddr(3)を使って) attr でスタックアドレス属性が設定されている場合には、呼び出し側がそ のスレッドのスタックを割り当てていることを意味するので、guard size 属性 は無視される (すなわち、システムによるガード領域の作成は行われない)。 この場合、スタックオーバーフローが起こらないように対処するのはアプリ ケーション側の責任となる (おそらく mprotect(2) を使って、割り当て られたスタックの最後に手動でガード領域を定義することになるだろう)。

pthread_attr_getguardsize() は、 スレッド属性オブジェクト attr の guard size 属性を guardsize が指すバッファーに入れて返す。  

返り値

成功すると、これらの関数は 0 を返す。 エラーの場合、0 以外のエラー番号を返す。  

エラー

POSIX.1 では、エラー EINVAL が
 attr か guardsize が無効な場合に対して規定されている。 Linux では、これらの関数は常に成功する (ただし、移植性や将来も動作することを保証したいアプリケーションでは 正のエラーの返り値を処理するようにすべきである)。  

バージョン

これらの関数は glibc バージョン 2.1 以降で提供されている。  

属性

この節で使用されている用語の説明については、 attributes(7) を参照。
インターフェース 属性 値
pthread_attr_setguardsize(), pthread_attr_getguardsize() Thread safety MT-Safe
 

準拠

POSIX.1-2001, POSIX.1-2008.  

注意

ガード領域は、読み出し/書き込みアクセスが行われないように保護がかけ られた仮想メモリーページで構成で構成される。スレッドがスタックをガード 領域までオーバーフローさせた場合、ほとんどのハードウェアアーキテクチャー では、スレッドに SIGSEGV シグナルが送られ、オーバーフローが発生した ことが通知される。ガード領域はページ境界から開始され、ガード領域の 大きさはスレッド作成時に内部的にシステムのページサイズに切り上げられる (その場合も pthread_attr_getguardsize() では pthread_attr_setguardsize() で設定された guard size が返される)。

多くのスレッドを作成するアプリケーションで、かつ、スタックオーバーフロー が決して発生しないことが分かっている場合には、guard size を 0 に設定 することで、メモリーを節約できることもある。

スレッドがスタックに大きなデータ構造を割り当てる場合には、 スタックオーバーフローを検出するためには、デフォルトサイズよりも 大きな guard size を選ぶ必要があるかもしれない。  

バグ

glibc 2.8 の時点では、 NPTL スレッド実装ではガード領域はスタックサイズ で割り当てられる領域の中に含まれている。一方、POSIX.1 では、スタックの 末尾に追加の領域を割り当てることが求められている。 (このため、ガード領域が大きすぎて、 実際のスタック用の場所がなくなってしまう場合、 pthread_create(3) で EINVAL エラーが発生することになる。)

廃止予定の LinuxThreads 実装では、 POSIX.1 で求められている通りの動作で、 ガード領域がスタックの末尾に追加の領域が割り当てられる。  

例

pthread_getattr_np(3) を参照。  

関連項目

mmap(2), mprotect(2), pthread_attr_init(3), pthread_attr_setstack(3), pthread_attr_setstacksize(3), pthread_create(3), pthreads(7)  

この文書について

この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。

関連キーワード

attr   領域   スタック   スレッド   ガード   size   属性   guard   pthread   setguardsize   getguardsize   オーバーフロー   末尾   バグ   setstack   成功   アプリケーション   メモリー   構成   実装   create   コンパイル   バイト   setstackaddr   アドレス

Linux マニュアル 一覧

関連するコマンド・関数

pthread_attr_setguardsize.3   pthread_attr_getstack.3   pthread_attr_setstack.3   pthread_attr_getstackaddr.3   pthread_attr_setstackaddr.3   pthread_attr_getstacksize.3
 

Index

名前
書式
説明
返り値
エラー
バージョン
属性
準拠
注意
バグ
例
関連項目
この文書について

This document was created by man2html, using the manual pages.
Time: 04:39:16 GMT, October 11, 2026