typedef struct sigaltstack {
char *ss_sp;
size_t ss_size;
int ss_flags;
} stack_t;
Ft int
Fn sigaltstack const stack_t * restrict ss stack_t * restrict oss
SS_DISABLE が Fa ss_flags で設定されていると、 Fa ss_sp と Fa ss_size は無視されてシグナルスタックは無効になります。 アクティブなスタックを無効にしようとすると、 Fn sigaltstack は -1 を戻し errno を Er EINVAL に設定します。 スタックが無効になると、すべてのシグナルは通常の ユーザスタックで動作するようになります。 スタックが後で有効にると、代替スタックで処理するように指定された すべてのシグナルは、その指定どおりに再開されます。
Fa oss を 0 以外にすると、現在のシグナルスタックの状態が戻されます。 Fa ss_flags フィールドの値は、プロセスが現在シグナルスタックにある場合は SS_ONSTACK に、シグナルスタックが現在無効である場合は SS_DISABLE になります。
if ((sigstk.ss_sp = malloc(SIGSTKSZ)) == NULL)
/* error return */
sigstk.ss_size = SIGSTKSZ;
sigstk.ss_flags = 0;
if (sigaltstack(&sigstk,0) < 0)
perror("sigaltstack");
デフォルトサイズ以外の特定量のスタックスペースを必要とする
シグナルハンドラを使用するプログラムでは、別の方法が使用できます。
値
MINSIGSTKSZ
は、代替スタックの実行にオペレーティングシステムが
必要とするバイト数 / 文字数に定義されています。
代替スタックのサイズを算出する場合は、プログラムでスタック要件に
MINSIGSTKSZ
を追加し、オペレーティングシステムのオーバヘッドを許容する必要があります。
シグナルスタックは、スタックの拡大傾向とアラインメント要件に従って 自動的に調整されます。 シグナルスタックは、ハードウェアで保護されることもされないこともあり、 通常のスタックのように自動的に ``拡大'' しません。 スタックがオーバフローし、スペースが保護されていない場合は、 予期せぬ結果となることがあります。