総合手引 | セクション 2 | English | オプション |
#include <signal.h>
typedef struct sigaltstack { char *ss_sp; size_t ss_size; int ss_flags; } stack_t;
SS_DISABLE が ss_flags で設定されていると、 ss_sp と ss_size は無視されてシグナルスタックは無効になります。 アクティブなスタックを無効にしようとすると、 sigaltstack() は -1 を戻し errno を EINVAL に設定します。 スタックが無効になると、すべてのシグナルは通常の ユーザスタックで動作するようになります。 スタックが後で有効にると、代替スタックで処理するように指定された すべてのシグナルは、その指定どおりに再開されます。
oss を 0 以外にすると、現在のシグナルスタックの状態が戻されます。 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 を追加し、オペレーティングシステムのオーバヘッドを許容する必要があります。
シグナルスタックは、スタックの拡大傾向とアラインメント要件に従って 自動的に調整されます。 シグナルスタックは、ハードウェアで保護されることもされないこともあり、 通常のスタックのように自動的に ``拡大'' しません。 スタックがオーバフローし、スペースが保護されていない場合は、 予期せぬ結果となることがあります。
[EFAULT] | |
ss か oss が、プロセスアドレス空間の有効な部分でないメモリを指しています。 | |
[EINVAL] | |
アクティブなスタックを無効にしようとしました。 | |
[ENOMEM] | |
代替スタック領域のサイズが MINSIGSTKSZ 以下になっています。 | |
SIGALTSTACK (2) | May 1, 1995 |
総合手引 | セクション 2 | English | オプション |
このマニュアルページサービスについてのご意見は Ben Bullock にお知らせください。 Privacy policy.
“ | I'm not interested in developing a powerful brain. All I'm after is just a mediocre brain, something like the President of the American Telephone and Telegraph Company. | ” |
— Alan Turing |