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
分享到:
相关推荐
- 使用`pthread_sigmask()`可以改变线程的信号掩码,控制线程接收哪些信号。 8. **源码分析** - 在源码中,可以看到如何创建和管理线程,如何使用互斥锁、条件变量等同步机制,以及如何处理线程取消和调度等问题...
《Programming with POSIX Threads》是一本深入探讨多线程编程的经典著作,主要针对使用POSIX线程(也称为pthreads)的开发人员。POSIX线程是UNIX和类UNIX系统中的多线程API,它提供了在单个进程内创建和管理多个...
POSIX线程,通常简称为pthreads,是操作系统编程中的一个关键概念,特别是在多处理器和多核系统中。它是开放系统互连(OSI)模型的一部分,由IEEE POSIX标准定义,旨在提供跨不同Unix和类Unix系统的一致性线程接口。...
3. **编写代码**:按照POSIX线程API编写多线程程序。 4. **编译与运行**:使用配置好的编译器编译程序,然后在Windows环境下运行。 总结而言,pthreads-w32库为Windows开发者提供了一种在Windows系统上使用POSIX...
为了解决这个问题,开发人员创建了pthreads-w32,它是一个开源项目,旨在为Windows提供与POSIX线程接口兼容的实现。 标题中的“pthreads-w32-2-8-0-release”是该项目的一个特定版本,这表明它是一个针对Windows...
3. **线程同步**:`pthread`库提供了多种同步机制,如互斥锁(`pthread_mutex_t`)、条件变量(`pthread_cond_t`)、读写锁(`pthread_rwlock_t`)等。这些同步机制的实现可以在`pthread`源代码中找到,它们是多线程...
这个库是POSIX线程(也称为pthreads)的实现,对于编写多线程应用程序至关重要。本文将深入探讨libpthread.so库的功能、用途及其在开发中的应用。 首先,libpthread.so是Linux内核提供的一种系统级服务,它实现了...
"cmdqueue:基于C中pthread的高效调度队列"是一个专门用于处理C语言环境下的命令调度的库,它利用POSIX线程(pthread)来实现高效的并发执行。POSIX线程是跨平台的多线程API,广泛应用于Unix-like系统中,如Linux。 ...
通常,可以使用`pthread_sigmask()`来改变线程的信号掩码,这样可以控制哪些线程可以接收特定的信号。 此外,`sigaction()`函数用于设置信号处理函数,可以替代传统的`signal()`函数,因为它允许更精细的控制,如...
默认情况下,信号会被发送到进程中的任意线程,但可以使用pthread_sigmask来设置线程的信号掩码,实现线程级别的信号控制。 七、实时信号 除了标准的POSIX信号,Linux还支持实时信号(Realtime Signals),它们提供...