.\" Copyright (c) 1983, 1991, 1992, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)sigaltstack.2 8.2 (Berkeley) 5/1/95 .\" %FreeBSD: src/lib/libc/sys/sigaltstack.2,v 1.21 2002/12/18 09:22:31 ru Exp % .\" .\" $FreeBSD$ .Dd May 1, 1995 .Dt SIGALTSTACK 2 .Os .Sh 名称 .Nm sigaltstack .Nd シグナルスタックコンテキストの設定や入手 .Sh ライブラリ .Lb libc .Sh 書式 .In signal.h .Bd -literal typedef struct sigaltstack { char *ss_sp; size_t ss_size; int ss_flags; } stack_t; .Ed .Ft int .Fn sigaltstack "const stack_t * restrict ss" "stack_t * restrict oss" .Sh 解説 .Fn sigaltstack システムコールを使用することにより、ユーザはシグナルを処理する別のスタックを 定義できます。 .Fa ss が 0 でない場合、シグナルを配信する .Em シグナルスタック へのポインタとサイズが指定され、プロセスがそのスタックで 動作中であるかどうかがシステムに伝えられます。 ハンドラがシグナルスタックで動作する必要があることを シグナルのアクションが示す場合 ( .Xr sigaction 2 システムコールで指定)、システムは、プロセスがそのスタックで 動作中であるかどうかをチェックします。 プロセスがシグナルスタックで動作していない場合、システムは、 シグナルハンドラの動作中はシグナルスタックを適切なものに切り替えます。 .Pp .Dv SS_DISABLE が .Fa ss_flags で設定されていると、 .Fa ss_sp と .Fa ss_size は無視されてシグナルスタックは無効になります。 アクティブなスタックを無効にしようとすると、 .Fn sigaltstack は -1 を戻し .Va errno を .Er EINVAL に設定します。 スタックが無効になると、すべてのシグナルは通常の ユーザスタックで動作するようになります。 スタックが後で有効にると、代替スタックで処理するように指定された すべてのシグナルは、その指定どおりに再開されます。 .Pp .Fa oss を 0 以外にすると、現在のシグナルスタックの状態が戻されます。 .Fa ss_flags フィールドの値は、プロセスが現在シグナルスタックにある場合は .Dv SS_ONSTACK に、シグナルスタックが現在無効である場合は .Dv SS_DISABLE になります。 .Sh 注 値 .Dv SIGSTKSZ は、代替スタック領域を割り当てる一般的なケースで使用する バイト数 / 文字数に定義されます。 代替スタックの割り当てには、一般的に以下のようなコードが使用されます。 .Bd -literal -offset indent if ((sigstk.ss_sp = malloc(SIGSTKSZ)) == NULL) /* error return */ sigstk.ss_size = SIGSTKSZ; sigstk.ss_flags = 0; if (sigaltstack(&sigstk,0) < 0) perror("sigaltstack"); .Ed デフォルトサイズ以外の特定量のスタックスペースを必要とする シグナルハンドラを使用するプログラムでは、別の方法が使用できます。 値 .Dv MINSIGSTKSZ は、代替スタックの実行にオペレーティングシステムが 必要とするバイト数 / 文字数に定義されています。 代替スタックのサイズを算出する場合は、プログラムでスタック要件に .Dv MINSIGSTKSZ を追加し、オペレーティングシステムのオーバヘッドを許容する必要があります。 .Pp シグナルスタックは、スタックの拡大傾向とアラインメント要件に従って 自動的に調整されます。 シグナルスタックは、ハードウェアで保護されることもされないこともあり、 通常のスタックのように自動的に ``拡大'' しません。 スタックがオーバフローし、スペースが保護されていない場合は、 予期せぬ結果となることがあります。 .Sh 戻り値 .Rv -std sigaltstack .Sh エラー 以下のうち 1 つが発生すると、 .Fn sigaltstack システムコールは処理を失敗し、シグナルスタックコンテキストは変更されずに 残ります。 .Bl -tag -width Er .It Bq Er EFAULT .Fa ss か .Fa oss が、プロセスアドレス空間の有効な部分でないメモリを指しています。 .It Bq Er EINVAL アクティブなスタックを無効にしようとしました。 .It Bq Er ENOMEM 代替スタック領域のサイズが .Dv MINSIGSTKSZ 以下になっています。 .El .Sh 関連項目 .Xr sigaction 2 , .Xr setjmp 3 .Sh 歴史 .Fn sigaltstack の前バージョンである .Fn sigstack システムコールは .Bx 4.2 で登場しました。