PTHREAD_SIGNAL

Section: C Library Functions (3)
Updated: LinuxThreads
IndexJM Home Page

 

名前

pthread_sigmask, pthread_kill, sigwait - スレッド内でのシグナルハンドリング

 

書式

#include <pthread.h>
#include <signal.h>

int pthread_sigmask(int how, const sigset_t *newmask, sigset_t *oldmask);

int pthread_kill(pthread_t thread, int signo);

int sigwait(const sigset_t *set, int *sig);

 

説明

pthread_sigmaskは呼び出しスレッドのシグナルマスクを 引数howおよびnewmaskで指定されるように変更する。oldmaskNULLでないときには、直前のシグナルマスクがoldmaskで指し示される領域に格納される。

引数howおよびnewmaskの意味はsigprocmask(2) の引数の意味と同じである。howSIG_SETMASKのときには、 シグナルマスクがnewmaskに設定される。howSIG_BLOCKのときには、newmaskで指定されるシグナルが現時点のシグナルマスクに追加される。howSIG_UNBLOCKのときには、newmaskで指定されるシグナルが現時点のシグナルマスクから取り除かれる。

シグナルマスクはスレッドごとに設定されることを思い出してほしい。 しかしsigaction(2) で設定される シグナルアクションとシグナルハンドラは、 すべてのスレッドで共通である。

pthread_killはシグナル番号signoのシグナルを スレッドthreadに送信する。 シグナルはkill(2) に書かれているように配送されハンドルされる。

sigwaitsetで指定されるシグナルのうちいずれか 1 つが呼び出しスレッドに 配送されるまで呼び出しスレッドの実行を停止する。 そして受信したシグナルの数をsigで指し示される領域に格納して返る。setで指定されるシグナルはsigwaitに入るときにブロックされていなければならず、無視されてはならない。 配送されたシグナルに対するシグナルハンドラが登録されていても、 ハンドラ関数は呼び出されない

 

取り消し

sigwaitは取り消しポイントである。

 

返り値

成功すると、0 が返る。 失敗の場合、非 0 のエラーコードが返る。

 

エラー

関数pthread_sigmaskはエラーのとき、次のようなエラーコードを返す:

EINVAL
howSIG_SETMASKおよびSIG_BLOCKSIG_UNBLOCKのいずれでもない。

EFAULT
newmaskまたはoldmaskが無効なアドレスを指している。

関数pthread_killはエラーのとき、次のようなエラーコードを返す:

EINVAL
signoは有効なシグナル番号でない。

ESRCH
スレッドthreadは存在しない (例えば、そのスレッドはすでに終了している) 。

関数sigwaitがエラーを返すことはない。

 

著者

Xavier Leroy <Xavier.Leroy@inria.fr>

 

関連項目

sigprocmask(2),kill(2),sigaction(2),sigsuspend(2).

 

注意

sigwaitが確実に機能するように、 配送を待つシグナルは、呼び出しスレッドだけでなく すべてのスレッドでブロックされていなければならない。 そうでない場合、POSIX のシグナル配送機構は シグナルを受信するスレッドがsigwaitを呼び出しているスレッドとなることを保証しない。 これを実現する最もよい方法は、 どのスレッドを生成するよりも前にそれらのシグナルをブロックし、 プログラム中ではsigwaitを呼び出す以外、ブロックを解除しないことである。

 

バグ

LinuxThreads のシグナルハンドリングは POSIX 標準とは大きく異なっている。 POSIX 標準によると、「非同期の」 (外部の) シグナルは プロセス全体 (すべてのスレッドの集まり) に対して発行され、 その後特定の 1 つのスレッドに配送される。 実際にシグナルを受信するスレッドは その時点でシグナルをブロックしていないスレッドのいずれかとなる。

LinuxThreads では、 それぞれのスレッドが実際には固有の PID をもつカーネルプロセスであるため、 外部のシグナルは特定の 1 つのスレッドに直接配送される。 例えば、もし別のスレッドがsigwaitを使ってそのシグナルをブロックしても、 そのスレッドが再開されることはない。

sigwaitの LinuxThreads の実装では、sigwaitは待ちの期間中、setに含まれるシグナルに対応するダミーのシグナルハンドラを登録する。 シグナルハンドラはすべてのスレッドで共通であるため、 他のスレッドはこれらのシグナルに対して独自のシグナルハンドラを登録してはならない。 あるいはその代わりに、すべてのスレッドが これらのシグナルをブロックしなければならない (このことはとにかく推奨されている -- 注意のセクションを参照のこと) 。


関連キーワード

シグナル,sigwait,pthread,ブロック,newmask,how,PTHREAD,ハンドラ,マスク,kill 

Index

名前
書式
説明
取り消し
返り値
エラー
著者
関連項目
注意
バグ

This document was created byman2html, using the manual pages.
Time: 15:49:14 GMT, July 11, 2021