スポンサーリンク

SIGALTSTACK(2) FreeBSD システムコールマニュアル SIGALTSTACK(2)

名称

sigaltstack − シグナルスタックコンテキストの設定や入手

ライブラリ

標準 C ライブラリ (libc, −lc)

書式

#include <signal.h>

typedef struct sigaltstack {
        char    *ss_sp;
        size_t  ss_size;
        int     ss_flags;
} stack_t;

int

sigaltstack(const stack_t * restrict ss, stack_t * restrict oss);

解説

sigaltstack() システムコールを使用することにより、ユーザはシグナルを処理 する別のスタックを定義できます。 ss が 0 でない場合、シグナルを配信する シグナルスタックへのポインタとサイズが指定され、プロセスがそのスタックで 動作中であるかどうかがシステムに伝えられます。ハンドラがシグナルスタック で動作する必要があることをシグナルのアクションが示す場合 ( sigaction(2) システムコールで指定)、システムは、プロセスがそのスタックで動作中であるか どうかをチェックします。プロセスがシグナルスタックで動作していない場合、 システムは、シグナルハンドラの動作中はシグナルスタックを適切なものに切り 替えます。

SS_DISABLE が ss_flags で設定されていると、 ss_spss_size は無視されて シグナルスタックは無効になります。アクティブなスタックを無効にしようとす ると、 sigaltstack() は -1 を戻し errno を EINVAL に設定します。スタック が無効になると、すべてのシグナルは通常のユーザスタックで動作するようにな ります。スタックが後で有効にると、代替スタックで処理するように指定された すべてのシグナルは、その指定どおりに再開されます。

oss を 0 以外にすると、現在のシグナルスタックの状態が戻されます。 ss_flags フィールドの値は、プロセスが現在シグナルスタックにある場合は SS_ONSTACK に、シグナルスタックが現在無効である場合は SS_DISABLE になりま す。

値 SIGSTKSZ は、代替スタック領域を割り当てる一般的なケースで使用するバイ ト数 / 文字数に定義されます。代替スタックの割り当てには、一般的に以下のよ うなコードが使用されます。

      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 を追加し、オペレーティングシステムのオーバヘッド を許容する必要があります。

シグナルスタックは、スタックの拡大傾向とアラインメント要件に従って自動的 に調整されます。シグナルスタックは、ハードウェアで保護されることもされな いこともあり、通常のスタックのように自動的に ‘‘拡大’’ しません。スタック がオーバフローし、スペースが保護されていない場合は、予期せぬ結果となるこ とがあります。

戻り値

関数 sigaltstack() は、処理が成功すると値 0 を返します。そうでない場合、 値 -1 が返され、グローバル変数 errno が設定されてエラーを示します。

エラー

以下のうち 1 つが発生すると、 sigaltstack() システムコールは処理を失敗 し、シグナルスタックコンテキストは変更されずに残ります。

       [EFAULT]

ssoss が、プロセスアドレス空間の有効な部分でないメ モリを指しています。

[EINVAL]
アクティブなスタックを無効にしようとしました。

[ENOMEM]
代替スタック領域のサイズが MINSIGSTKSZ 以下になってい ます。

関連項目

sigaction(2), setjmp(3)

歴史

sigaltstack() の前バージョンである sigstack() システムコールは 4.2BSD で 登場しました。

FreeBSD 10.0 May 1, 1995 FreeBSD 10.0

スポンサーリンク