3、POSIX 线程 – pthread_sigmask

POSIX 线程 – pthread_sigmask 收藏
POSIX 线程 – pthread_sigmask


在多线程的程序里,希望只在主线程中处理信号,可以使用


函数:
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


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fytzzh/archive/2006/04/12/660457.aspx
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值