当前位置: 代码迷 >> 综合 >> 3、POSIX 线程 – pthread_sigmask
  详细解决方案

3、POSIX 线程 – pthread_sigmask

热度:81   发布时间:2024-01-15 22:28:40.0
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