pthread_sigmaskのヘルプ・マニュアル
日本語 英語
pthread_sigmask --help
man pthread_sigmask
PTHREAD_SIGNAL(3) PTHREAD_SIGNAL(3)
名前
pthread_sigmask, pthread_kill, sigwait - スレッド内でのシグナルハンドリ
ング
書式
#include
#include
int pthread_sigmask(int how, const sigset_t *newmask, sigset_t *old-
mask);
int pthread_kill(pthread_t thread, int signo);
int sigwait(const sigset_t *set, int *sig);
説明
pthread_sigmask は 呼 び出しスレッドのシグナルマスクを引数 how および
newmask で指定されるように変更する。 oldmask が NULL でないときには、直
前のシグナルマスクが oldmask で指し示される領域に格納される。
引 数 how および newmask の意味は sigprocmask(2) の引数の意味と同じであ
る。 how が SIG_SETMASK のときには、シグナルマスクが newmask に設定され
る。 how が SIG_BLOCK のときには、 newmask で指定されるシグナルが現時点
のシグナルマスクに追加される。 how が SIG_UNBLOCK のときには、 newmask
で指定されるシグナルが現時点のシグナルマスクから取り除かれる。
シ グナルマスクはスレッドごとに設定されることを思い出してほしい。しかし
sigaction(2) で設定されるシグナルアクションとシグナルハンドラは、すべて
のスレッドで共通である。
pthread_kill はシグナル番号 signo のシグナルをスレッド thread に送信す
る。シグナルは kill(2) に書かれているように配送されハンドルされる。
sigwait は set で指定されるシグナルのうちいずれか 1 つが呼び出しスレ ッ
ド に配送されるまで呼び出しスレッドの実行を停止する。そして受信したシグ
ナルの数を sig で指し示される領域に格納して返る。 set で指定されるシ グ
ナルは sigwait に入るときにブロックされていなければならず、無視されては
ならない。配送されたシグナルに対するシグナルハンドラが登録されていて も
、ハンドラ関数は呼び出され ない。
取り消し
sigwait は取り消しポイントである。
返り値
成功すると、0 が返る。失敗の場合、非 0 のエラーコードが返る。
エラー
関数 pthread_sigmask はエラーのとき、次のようなエラーコードを返す:
EINVAL how が SIG_SETMASK および SIG_BLOCK 、 SIG_UNBLOCK のいず
れでもない。
EFAULT newmask または oldmask が無効なアドレスを指している。
関数 pthread_kill はエラーのとき、次のようなエラーコードを返す:
EINVAL signo は有効なシグナル番号でない。
ESRCH スレッド thread は存在しない (例えば、そのスレッドはす で
に終了している) 。
関数 sigwait がエラーを返すことはない。
著者
Xavier Leroy
関連項目
sigprocmask(2), kill(2), sigaction(2), sigsuspend(2).
注意
sigwait が確実に機能するように、配送を待つシグナルは、呼び出しスレッド
だけでなくすべてのスレッドでブロックされていなければならない。そうで な
い 場合、POSIX のシグナル配送機構はシグナルを受信するスレッドが sigwait
を呼び出しているスレッドとなることを保証しない。これを実現する最もよ い
方 法は、どのスレッドを生成するよりも前にそれらのシグナルをブロックし、
プログラム中では sigwait を呼び出す以外、ブロックを解除しないことである
。
バグ
LinuxThreads のシグナルハンドリングは POSIX 標準とは大きく異なっている
。 POSIX 標準によると、「非同期の」 (外部の) シグナルはプロセス全体 (す
べてのスレッドの集まり) に対して発行され、その後特定の 1 つのスレッドに
配送される。実際にシグナルを受信するスレッドはその時点でシグナルをブ ロ
ックしていないスレッドのいずれかとなる。
LinuxThreads では、それぞれのスレッドが実際には固有の PID をもつカーネ
ルプロセスであるため、外部のシグナルは特定の 1 つのスレッドに直接配送さ
れる。例えば、もし別のスレッドが sigwait を使ってそのシグナルをブロック
しても、そのスレッドが再開されることはない。
sigwait の LinuxThreads の実装では、 sigwait は待ちの期間中、 set に 含
ま れるシグナルに対応するダミーのシグナルハンドラを登録する。シグナルハ
ンドラはすべてのスレッドで共通であるため、他のスレッドはこれらのシグ ナ
ル に対して独自のシグナルハンドラを登録してはならない。あるいはその代わ
りに、すべてのスレッドがこれらのシグナルをブロックしなければならない (
このことはとにかく推奨されている -- 注意のセクションを参照のこと) 。
LinuxThreads PTHREAD_SIGNAL(3)
PTHREAD_SIGMASK(3) Linux Programmer’s Manual PTHREAD_SIGMASK(3)
NAME
pthread_sigmask - examine and change mask of blocked signals
SYNOPSIS
#include
int pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset);
Compile and link with -pthread.
DESCRIPTION
The pthread_sigmask() function is just like sigprocmask(2), with the
difference that its use in multithreaded programs is explicitly speci-
fied by POSIX.1-2001. Other differences are noted in this page.
For a description of the arguments and operation of this function, see
sigprocmask(2).
RETURN VALUE
On success, pthread_sigmask() returns 0; on error, it returns an error
number.
ERRORS
See sigprocmask(2).
CONFORMING TO
POSIX.1-2001.
NOTES
A new thread inherits a copy of its creator’s signal mask.
EXAMPLE
The program below blocks some signals in the main thread, and then cre-
ates a dedicated thread to fetch those signals via sigwait(3). The
following shell session demonstrates its use:
$ ./a.out &
[1] 5423
$ kill -QUIT %1
Signal handling thread got signal 3
$ kill -USR1 %1
Signal handling thread got signal 10
$ kill -TERM %1
[1]+ Terminated ./a.out
Program source
#include
#include
#include
#include
#include
#include
/* Simple error handling functions */
#define handle_error_en(en, msg) \
do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)
static void *
sig_thread(void *arg)
{
sigset_t *set = (sigset_t *) arg;
int s, sig;
for (;;) {
s = sigwait(set, &sig);
if (s != 0)
handle_error_en(s, "sigwait");
printf("Signal handling thread got signal %d\n", sig);
}
}
int
main(int argc, char *argv[])
{
pthread_t thread;
sigset_t set;
int s;
/* Block SIGINT; other threads created by main() will inherit
a copy of the signal mask. */
sigemptyset(&set);
sigaddset(&set, SIGQUIT);
sigaddset(&set, SIGUSR1);
s = pthread_sigmask(SIG_BLOCK, &set, NULL);
if (s != 0)
handle_error_en(s, "pthread_sigmask");
s = pthread_create(&thread, NULL, &sig_thread, (void *) &set);
if (s != 0)
handle_error_en(s, "pthread_create");
/* Main thread carries on to create other threads and/or do
other work */
pause(); /* Dummy pause so we can test program */
}
SEE ALSO
sigaction(2), sigpending(2), sigprocmask(2) pthread_create(3),
pthread_kill(3), sigsetops(3), pthreads(7), signal(7)
COLOPHON
This page is part of release 3.22 of the Linux man-pages project. A
description of the project, and information about reporting bugs, can
be found at http://www.kernel.org/doc/man-pages/.
Linux 2009-01-25 PTHREAD_SIGMASK(3)