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 になります。
デフォルトサイズ以外の特定量のスタックスペースを必要とする シグナルハンドラを使用するプログラムでは、別の方法が使用できます。 値 MINSIGSTKSZ は、代替スタックの実行にオペレーティングシステムが 必要とするバイト数 / 文字数に定義されています。 代替スタックのサイズを算出する場合は、プログラムでスタック要件に MINSIGSTKSZ を追加し、オペレーティングシステムのオーバヘッドを許容する必要があります。if ((sigstk.ss_sp = malloc(SIGSTKSZ)) == NULL) /* error return */ sigstk.ss_size = SIGSTKSZ; sigstk.ss_flags = 0; if (sigaltstack(&sigstk,0) < 0) perror("sigaltstack");
シグナルスタックは、スタックの拡大傾向とアラインメント要件に従って 自動的に調整されます。 シグナルスタックは、ハードウェアで保護されることもされないこともあり、 通常のスタックのように自動的に ``拡大'' しません。 スタックがオーバフローし、スペースが保護されていない場合は、 予期せぬ結果となることがあります。