sigaltstack() - シグナル代替スタック・コンテキストの設定または取得

標準

標準/拡張機能 C/C++ 依存項目

XPG4.2
Single UNIX Specification、バージョン 3

両方 POSIX(ON)

形式

#define _XOPEN_SOURCE_EXTENDED 1
#include <signal.h>

int sigaltstack(const stack_t *__restrict__ ss, stack_t *__restrict__ oss);

機能説明

sigaltstack() 関数によって、シグナル・ハンドラーの代替スタック の状態を、スレッドで定義および検査することができます。代替スタックでの実行を明示的に宣言されているシグナルは、代替スタック で送達されることになります。

注: シグナル・キャッチャーの代替シグナル・スタックでの実行を 明示的に宣言するためには、シグナル・アクションが sigaction() を 介して設定される際に、SA_ONSTACK フラグを sa_flags に設定 する必要があります。
ss が NULL 以外のポインターの場合、それは、sigaltstack() から の戻り時に有効となる、代替シグナル・スタックを指定する stack_t 構造体を指します。ss_flags メンバーは、新規スタックの状態を指定します。これが SS_DISABLE に設定されると、スタックは使用不可となり、ss_sp および ss_size は無視されます。そうでない場合には、スタックは使用可能となり、ss_sp および ss_size メンバーは、スタックの新規アドレスおよびサイズを指定します。
AMODE 64 に関する考慮事項: このスタック用のストレージは 2 GB 境界より上でなければなりません。 これは、__malloc24() または __malloc31() 関数で獲得されたストレージではない場合があります。

ss_sp で開始するアドレスの範囲 (最大 ss_sp + ss_size だが これをインクルードしない) は、スタックとしての使用についてのインプリメンテーション では使用可能です。このインターフェースでは、どちらの終了が スタック・ベースで、項目がプッシュされるときに、どちらの方向に スタックが伸びてゆくかに関しては前提事項を作成しません。

正常終了時に、oss が NULL 以外のポインターの場合、それは、sigaltstack() への呼び出しの前に有効だった代替シグナル・スタックを指定する、stack_t 構造体を指します。ss_sp および ss_size メンバーにより、そのスタックのアドレスおよびサイズが指定されます。 ss_flags メンバーでスタックの状態が指定され、次の値の 1 つが含まれる 場合があります。
SS_ONSTACK
スレッドは現在、代替シグナル・スタックで実行中です。スレッドの代替シグナル・スタックでの実行中に、このスタックを変更 しようとして、失敗します。このフラグを、スレッドによって変更 する必要はありません。
SS_DISABLE
現在、代替シグナル・スタックは使用できません。

値 SIGSTKSZ は、バイト数を指定するシステム・デフォルトで、代替スタック域を手操作で割り振る通常の事例を取り扱う ために使用されます。値 MINSIGSTKSZ は、シグナル・ハンドラーの最小スタック・サイズになるように定義 されます。代替シグナル・スタック・サイズの計算において、システムの インプリメンテーション・オーバーヘッドを許可するために、プログラムでスタック要件にその容量を追加する必要があります。定数 SS_ONSTACK、SS_DISABLE、SIGSTKSZ、および MINSIGSTKSZ は、<signal.h> で定義されます。

exec 関数の 1 つへの正常な呼び出しの後では、新規プロセス・イメージに代替シグナル・スタックはありません。

注 :
  1. シグナル・ハンドラーが代替スタックで実行可能になっている場合、そのシグナル・ハンドラーによって呼び出されるすべての関数は、同じリンケージによってコンパイルされている必要があります。例えば、シグナル・ハンドラーが XPLINK でコンパイルされている場合は、それが呼び出すすべての関数も、XPLINK でコンパイルされている必要があります。1 つの代替スタックのみを提供することができるため、リンケージを混合すること (上位および下位アドレスの方向へと増加する代替スタックの両方を必要とする) は、許可されません。作成されるスタックの型は、制御を付与されるシグナル・ハンドラーの属性によって 決まります。シグナル・ハンドラーが XPLINK でコンパイルされている場合、下位アドレス の方向へと増加するスタックが代替スタック内に作成され、AMODE 31 では、4 K の読み 取り専用保護ページを作成 (4 K 境界上に位置合わせされる) するために、ユーザー・ス タック内の十分なストレージを使用することも行われます。
  2. シグナル・ハンドラーが代替スタックで実行されているときに、新しいシグナルが受信される場合、および、新しいシグナルもまた、代替スタックで実行されるシグナル・ハンドラーを指定 した場合、シグナル・ハンドラーの両方とも、同じリンケージ (XPLINK または XPLINK 以外) で コンパイルされている必要があります。

戻り値

正常に実行された場合、sigaltstack() は 0 を戻します。

正常に実行されなかった場合、sigaltstack() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
EINVAL
ss 引数が NULL ポインターではなく 、ss で指定される ss_flags メンバーに 、SS_DISABLE 以外のフラグが含まれています。
ENOMEM
代替スタック域のサイズが MINSIGSTKSZ より小さく なっています。
EPERM
アクティブなスタックを変更しようとしました。

関連情報