Provided by: manpages-ja-dev_0.5.0.0.20221215+dfsg-1_all bug

名前

       sigreturn, rt_sigreturn - シグナルハンドラーから返り、スタックを掃除する

書式

       int sigreturn(...);

説明

       Linux  カーネルがプロセスに対してブロックされていないシグナルが処理待ちと判定した場合、 そ
       のプロセスの次回のユーザーモードへの遷移 (すなわち、システムコールからのリターン時やそのプ
       ロセスが CPU に再スケジュールされる際)、カーネルはユーザー空間スタックの新しいフレームを作
       成し、そこにプロセスコンテキストの種々の値 (プロセッサーのステータスワード、レジスター、シ
       グナルマスク、シグナルスタック設定) を保存する。

       また、  カーネルは、 ユーザーモードへの遷移時にシグナルハンドラーが呼び出され、 ハンドラー
       からのリターン時に、 制御が "signal trampoline" と呼ばれるユーザー空間コードブロックに渡さ
       れるように、準備を行う。 signal trampoline のコードが sigreturn() を呼び出す。

       sigreturn()  は、シグナルハンドラーを起動するために行ったことの全て — プロセスのシグナルマ
       スクの変更、 シグナルスタックの切り替え (sigaltstack(2)  参照) —  の取り消しを行う。以前に
       ユーザー空間スタックに保存された情報を使って、  sigreturn() はプロセスのシグナルマスクの復
       元、スタックの切り替え、プロセスのコンテキスト (プロセッサフラグ、レジスター (スタックポイ
       ンター、命令ポインターを含む)) の復元を行い、 プロセスがシグナルにより割り込まれた場所から
       実行を再開できるようにする。

返り値

       sigreturn()  が返ることはない。

準拠

       多くの UNIX 系のシステムには sigreturn()  システムコールか似たようなシステムコールがある。
       しかしながら、  このシステムコールは POSIX には規定されておらず、 その動作の詳細はシステム
       により異なる。

注意

       sigreturn()  exists only to allow the implementation of signal handlers.  It should  never
       be  called  directly.   (Indeed,  a simple sigreturn() wrapper in the GNU C library simply
       returns -1, with errno set to ENOSYS.)  Details  of  the  arguments  (if  any)  passed  to
       sigreturn()  vary  depending on the architecture.  (On some architectures, such as x86-64,
       sigreturn()  takes no arguments,  since  all  of  the  information  that  it  requires  is
       available  in  the stack frame that was previously created by the kernel on the user-space
       stack.)

       かつて、 UNIX システムでは signal trampoline コードがユーザースタックに置かれていた。 今日
       では、 ユーザースタックのページは保護され、 コードの実行は禁止されている。 したがって、 現
       代の Linux  システムでは、  アーキテクチャー依存ではあるが、  signal  trampoline  コードは
       vdso(7)  内もしくは  C ライブラリ内に置かれる。後者の場合、 C ライブラリの sigaction(2) の
       ラッパー関数は、 trampoline code の場所をそのアドレスを sigaction(2) 構造体の  sa_restorer
       フィールドに設定してカーネルに伝え、  sa_flags  フィールドの  SA_RESTORER フラグをセットす
       る。

       保存されたプロセスコンテキスト情報は ucontext_t構造体に置かれる (<sys/ucontext.h>  参照)。
       この構造体は、  sigaction(2) の SA_SIGINFO フラグで設定されたシグナルハンドラーの第 3 引数
       としてシングルハンドラー内で参照できる。

       他のいくつかの UNIX システムでは、 signal trampoline の扱いは少し異なる。 特に、  いくつか
       のシステムでは、  ユーザーモードに戻る際に、 カーネルは制御を (シグナルハンドラーではなく)
       trampoline に渡し、 trampoline コードがシグナルハンドラーを呼び出す  (その後ハンドラーが返
       ると sigreturn() を呼び出す)。

   C ライブラリとカーネルの違い
       The  original  Linux  system  call  was  named sigreturn().  However, with the addition of
       real-time signals in Linux 2.2, a new system call, rt_sigreturn()  was added to support an
       enlarged  sigset_t  type.   The  GNU  C library hides these details from us, transparently
       employing rt_sigreturn()  when the kernel provides it.

関連項目

       kill(2), restart_syscall(2), sigaltstack(2), signal(2), getcontext(3), signal(7), vdso(7)

この文書について

       この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの
       説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。