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编程指南,介绍关于PTHREAD的编程,在Linux下的应用。。
POSIX平台多线程编程指南 通用开放式操作系统的多线程应用指南。
POSIX线程(Pthread)编程指南
linux 同步与互斥 posix 线程互斥 实现 。(此为博客http://blog.csdn.net/shallnet 文章对应源码下载)
使用Posix线程实现的coroutine协程的关键在于栈的保存沿用,有很多其他版本的C实现的coroutine,如:setcontex, setjmp/longjmp。我认为线程拥有自己的数据栈,天然提供栈的沿用,再利用pthread_mutex_t, pthread_...
基于T_Kernel的POSIX线程库的研究 T_Kernel POSIX 线程库 T_Kernel POSIX 线程库
linux 同步与互斥 posix 线程同步互斥 消费者生产者 实现 。(此为博客http://blog.csdn.net/shallnet 文章对应源码下载)
分离线程 线程创建默认是⾮分离的,当pthread_join()函数返回时,创建的线程终⽌,释放⾃⼰占⽤的系统资源 分离线程不能被其他线程等待,pthread_join⽆效,线程⾃⼰玩⾃⼰的。 //设置是否为分离线程 //PTHREAD_...
x86_64-posix-sjlj x86_64-posix-seh x86_64-win32-sjlj x86_64-win32-seh posix和win32是os接口类型 sjlj, seh是异常处理方案 如果不确定,一般安装posix和seh即可 解压即用,注意安装路径不要有空格或...
linux 同步与互斥 posix 线程同步 实现 。(此为博客http://blog.csdn.net/shallnet 文章对应源码下载)
类POSIX功能的windows版C语言多线程库,简单好用,支持visual studio编译
POSIX线程编程指南 这是一个关于 Posix 线程编程的专栏。作者在阐明概念的基础上,将向您详细讲述Posix 线程库API
课 程 实 验 报 告 课程名称: 线程控制实验 专业班级: 学 号: 姓 名: 报告日期: 2013年12月03日 计算机科学与技术学院 线程控制实验 一、目的和要求 通过本实验掌握在 Linux操作系统中遵循 Posix线程标准接口...
这是linux下采用 POSIX 的 pthread 机制计算圆周率的程序
POSIX线程编程指南.pdfPOSIX线程编程指南.pdfPOSIX线程编程指南.pdfPOSIX线程编程指南.pdf
关于POSIX线程的讲解,供学习和工作使用,值得下载。
window平台可以使用和linux环境下一样的poisx接口编程,适用于使用linux开发的程序,移植到windows超级方便,posix下标准pthread接口如pthread_create,pthread_mutex_lock,pthread_rwlock,sem_post等接口直接支持,跨...
MinGW(x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0.7z)
这是将网上收集的IBM线程编程资料整理成了一个chm文件,便于使用。内容包括UNIX线程编程指南和详解部分,适合学习POSIX线程编程技术的人员使用。
Posix线程编程指南 线程 线程编程 linux