| 総合手引 | セクション 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 | ||