Manpages

名 前

pthread_sigmask − 禁 止 す る シ グ ナ ル マ ス ク の 確 認 と 変 更 を 行 う

書 式

#include <signal.h>

int pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset);

−pthread を 付 け て コ ン パ イ ル と リ ン ク を 行 う 。

glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):

pthread_sigmask():

_POSIX_C_SOURCE >= 199506L || _XOPEN_SOURCE >= 500

説 明

pthread_sigmask() 関 数 は sigprocmask(2) と 全 く 同 様 だ が 、 マ ル チ ス レ ッ ド プ ロ グ ラ ム で の 利 用 が POSIX.1−2001 で 明 示 的 に 規 定 さ れ て い る 点 が 異 な る 。 他 の 違 い は こ の マ ニ ュ ア ル ペ ー ジ で 説 明 す る 。 こ の 関 数 の 引 き 数 と 動 作 の 説 明 は sigprocmask(2) を 参 照 。

返 り 値

成 功 す る と 、 pthread_sigmask() は 0 を 返 す 。 エ ラ ー の 場 合 、 エ ラ ー 番 号 を 返 す 。

エ ラ ー

sigprocmask(2) を 参 照 。

属 性

マ ル チ ス レ ッ デ ィ ン グ (pthreads(7) 参 照 )

pthread_sigmask() 関 数 は ス レ ッ ド セ ー フ で あ る 。

準 拠

POSIX.1−2001.

注 意

新 し い ス レ ッ ド は 、 ス レ ッ ド を 作 成 し た ス レ ッ ド の シ グ ナ ル マ ス ク の コ ピ ー を 継 承 す る 。

以 下 の プ ロ グ ラ ム は 、 メ イ ン ス レ ッ ド で シ グ ナ ル の い く つ か を 禁 止 (block) す る よ う に 設 定 を 行 い 、 sigwait(3) 経 由 で そ れ ら の シ グ ナ ル を 集 め る 専 用 の ス レ ッ ド を 作 成 す る 。 下 記 の シ ェ ル の セ ッ シ ョ ン は そ の 利 用 例 を 示 し た も の で あ る 。

$ ./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 プ ロ グ ラ ム の ソ ー ス

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>

/* 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 = 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 SIGQUIT and SIGUSR1; 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 */ }

関 連 項 目

sigaction(2), sigpending(2), sigprocmask(2), pthread_create(3), pthread_kill(3), sigsetops(3), pthreads(7), signal(7)

こ の 文 書 に つ い て

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