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

標準

標準/拡張機能 C/C++ 依存項目
XPG4.2 両方 POSIX(ON)

形式

#define _XOPEN_SOURCE_EXTENDED 1
#include <signal.h>

int sigstack(struct sigstack *ss, struct sigstack *oss);

機能説明

sigstack() 関数によって、呼び出しスレッドは、このスレッド自身が受信したシグナルの処理に使用する、アドレス・スペースのエリアを、システムに指示することができます。

注: シグナル・キャッチャーの代替シグナル・スタックでの実行を 明示的に宣言するためには、シグナル・アクションが sigaction() を 介して設定される際に、SA_ONSTACK フラグを sa_flags に設定 する必要があります。
ss 引数が NULL ポインターではない場合には 、sigstack 構造体を示す必要があります。アプリケーション 提供スタックの長さは、SIGSTKSZ バイト以上であることが 必要です。代替シグナル・スタックがオーバーフローの場合、その結果とられる動作は未定義です。
  • ss_onstack メンバーの値は、シグナルの送達時に、スレッドが システムに代替シグナル・スタックを使用させたいかどうかを指示します。
  • ss_sp メンバーの値は、プロセスのアドレス・スペース内の 代替シグナル・スタック・エリアの望ましい位置を指示します。
    AMODE 64 : このスタック用のストレージは 2 GB 境界より上でなければなりません。 これは、__malloc24() または __malloc31() 関数で獲得されたストレージではない場合があります。
  • ss 引数が NULL ポインターではない場合には、現行代替シグナル・スタックのコンテキストは変更されません。

oss 引数が NULL ポインターではない場合には、現行代替シグナル・ スタックのコンテキストを入れる sigstack 構造体を指している 必要があります。スレッドが現在、代替シグナル・スタックで実行中の場合には、この sigstack 構造体の ss_onstack メンバー に保管された値は、ゼロ以外になります。oss 引数が NULL ポインターの場合には、現行代替シグナル・スタックのコンテキスト は戻されません。

シグナルのアクションが、そのハンドラーを代替シグナル・スタック で実行する必要があることを示している場合には (sigaction() の呼び出し によって指定)、インプリメンテーションは、スレッドが現在 代替シグナル・スタックで実行中かどうかを調べます。実行中で なかった場合には、システムで、シグナル・ハンドラーの実行の 期間、代替シグナル・スタックに切り替えられます。

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

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

    Single UNIX Specification、バージョン 3 のために 書かれたアプリケーションで、この関数を引き続き使う必要がある場合は、 標準システム・ヘッダーを組み込む前に、フィーチャー・テスト・マクロ _UNIX03_WITHDRAWN を 定義してください。マクロは、Single UNIX Specification、バージョン 3 に移動された すべてのインターフェースおよびシンボルを公開します。

戻り値

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

正常に実行されなかった場合、sigstack() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
EPERM
アクティブなスタックを変更しようとしました。

関連情報