您的位置:首页 > 其它

POSIX 线程 – pthread_sigmask

2011-05-24 10:50 465 查看

POSIX 线程 –
pthread_sigmask

POSIX 线程 – pthread_sigmask

POSIX
线程 –
pthread_sigmask

概念

按照 POSIX, 异步 (外部) 信号发送到整个进程.

所有线程共享同一个设置, 即通过 sigaction 设置的线程处置方法.

每个线程有自己的信号掩码, 线程库根据该掩码决定将信号发送到哪个线程.

由于 Linux 线程实现上的独特性, 外部信号始终发送到特定的线程.

pthread_sigmask

pthread_sigmask 用来定义线程的信号掩码

其接口与 sigprocmask 一样
===============================================================================
#include <pthread.h>
#include <signal.h>

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


pthread_kill 和 sigwait

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

int pthread_kill (pthread_t thread, int signo);
int sigwait (const sigset_t *set, int *sig);
===============================================================================


pthread_kill 向特定的线程发送信号.

sigwait 暂定调用线程, 直到 set 中定义的某个信号递达调用线程.

sigwait 返回时, sig 中保存的是接收到的信号编号.

sigwait 所等待的信号必须在所有线程中阻塞, 而不仅仅是调用线程. 在多线程的程序里,希望只在主线程中处理信号,可以使用

函数:

int pthread_sigmask (int how,

const sigset_t *set,

sigset_t *oset)

用作在主调线程里控制信号掩码。

How:

SIG_BLOCK:
结果集是当前集合参数集的并集
SIG_UNBLOCK: 结果集是当前集合参数集的差集
SIG_SETMASK: 结果集是由参数集指向的集

头文件: <signal.h>

错误: [EINVAL]
how不是已定义值
提示:
除非信号在所有的线程里都阻塞,否则总能将异步信号传输给这个进程。

例子:

#include <pthread.h>
#include <stdio.h>
#include <sys/signal.h>

#define NUMTHREADS 3
void sighand(int signo);

void *threadfunc(void *parm)
{
pthread_t             tid = pthread_self();
int                   rc;

printf("Thread %u entered/n", tid);
rc = sleep(30);
printf("Thread %u did not get expected results! rc=%d/n", tid, rc);
return NULL;
}

void *threadmasked(void *parm)
{
pthread_t             tid = pthread_self();
sigset_t              mask;
int                   rc;

printf("Masked thread %lu entered/n", tid);

sigfillset(&mask); /* Mask all allowed signals */
rc = pthread_sigmask(SIG_BLOCK, &mask, NULL);
if (rc != 0)
{
printf("%d, %s/n", rc, strerror(rc));
return NULL;
}

rc = sleep(15);
if (rc != 0)
{
printf("Masked thread %lu did not get expected results! "
"rc=%d /n", tid, rc);
return NULL;
}
printf("Masked thread %lu completed masked work/n",
tid);
return NULL;
}

int main(int argc, char **argv)
{
int                     rc;
int                     i;
struct sigaction        actions;
pthread_t               threads[NUMTHREADS];
pthread_t               maskedthreads[NUMTHREADS];

printf("Enter Testcase - %s/n", argv[0]);

printf("Set up the alarm handler for the process/n");
memset(&actions, 0, sizeof(actions));
sigemptyset(&actions.sa_mask);
actions.sa_flags = 0;
actions.sa_handler = sighand;

rc = sigaction(SIGALRM,&actions,NULL);

printf("Create masked and unmasked threads/n");
for(i=0; i<NUMTHREADS; ++i)
{
rc = pthread_create(&threads[i], NULL, threadfunc, NULL);
if (rc != 0)
{
printf("%d, %s/n", rc, strerror(rc));
return -1;
}

rc = pthread_create(&maskedthreads[i], NULL, threadmasked, NULL);
if (rc != 0)
{
printf("%d, %s/n", rc, strerror(rc));
return -1;
}
}

sleep(3);
printf("Send a signal to masked and unmasked threads/n");
for(i=0; i<NUMTHREADS; ++i)
{
rc = pthread_kill(threads[i], SIGALRM);

rc = pthread_kill(maskedthreads[i], SIGALRM);
}

printf("Wait for masked and unmasked threads to complete/n");
for(i=0; i<NUMTHREADS; ++i) {
rc = pthread_join(threads[i], NULL);

rc = pthread_join(maskedthreads[i], NULL);
}
printf("Main completed/n");
return 0;
}

void sighand(int signo)
{
pthread_t             tid = pthread_self();

printf("Thread %lu in signal handler/n",
tid);
return;
}


程序返回:

Enter Testcase -
./pthread_sigmask_test

Set up the alarm handler for the
process

Create masked and unmasked
threads

Thread 3086597040
entered

Masked thread 3076107184
entered

Thread 3065617328
entered

Masked thread 3055127472
entered

Thread 3044637616
entered

Masked thread 3034147760
entered

Send a signal to masked and
unmasked threads

Wait for masked and unmasked
threads to complete

Thread 3086597040 in signal
handler

Thread 3086597040 did not get
expected results! rc=27

Thread 3065617328 in signal
handler

Thread 3065617328 did not get
expected results! rc=27

Thread 3044637616 in signal
handler

Thread 3044637616 did not get
expected results! rc=27

Masked thread 3076107184 completed
masked work

Masked thread 3055127472 completed
masked work

Masked thread 3034147760 completed
masked work

Main
completed
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: