线程与信号

原创 2012年08月29日 17:58:06

总结:

signal()设置对某种信号的处理方式,只能有一种处理方式,即设置进程、线程的信号handler,对进程、线程都有效。
pthread_kill()可以向线程发送信号。
pthread_sigmask()设置线程的阻塞信号集,但是仅仅对该线程有效。
kill()向进程发送信号,由哪个线程处理该信号是未知的。可能发生的情况是,进程本身屏蔽了该信号,而某个线程没有屏蔽改信号,进而该线程处理了该信号。

示例:

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>

void sig_thread_func(int sig)
{
	printf("sig_thread_func : sig = %d\n", sig);
}
void sig_func(int sig)
{
	printf("sig_func : sig = %d\n",sig);
}

void *func1(void *arg)
{
    signal(SIGUSR1, sig_thread_func);   //线程1先运行,设置了signal

	sigset_t set;
	sigfillset(&set);
	sigdelset(&set, SIGUSR1);
	pthread_sigmask(SIG_SETMASK, &set, NULL);//线程1屏蔽了除了SIGUSR1外的所有信号

	printf("pthread 1 run\n");
	int i;
	for(i = 0; i < 7; ++i)
	{
		printf("1...\n");
		sleep(1);
	}
	return 0;
}
void *func2(void *arg)
{
	printf("pthread 2 run\n");
	int i;
	for(i = 0; i < 7; ++i)
	{
		printf("2...\n");
		sleep(1);
	}
	return 0;
}

int main()
{
	pthread_t tid1, tid2;
	pthread_create(&tid1, NULL, func1, NULL);
	pthread_create(&tid2, NULL, func2, NULL);

	sleep(1);
	signal(SIGUSR1, sig_func);  //覆盖了线程1设置的signal

    //向线程1发送SIGUSR1,SIGUSR2
	sleep(1);
	pthread_kill(tid1, SIGUSR1);//调动handler
	sleep(1);
	pthread_kill(tid1, SIGUSR2);//屏蔽了,无响应

    //向线程2发送SIGUSR1,SIGUSR2
	sleep(1);
	pthread_kill(tid2, SIGUSR1);//调用handler
	sleep(1);
	//pthread_kill(tid2, SIGUSR2);//会终止进程,是进程!

	sigset_t set;
	sigfillset(&set);
	sigprocmask(SIG_SETMASK, &set, NULL);//进程屏蔽了所有信号

	sleep(1);
	kill(getpid(), SIGUSR1);//调动handler?其实是线程1响应的

	pthread_join(tid1, NULL);
	pthread_join(tid2, NULL);

	return 0;
}
结果:

pthread 1 run
1...
pthread 2 run
2...
1...
2...
sig_func : sig = 10
1...
2...
1...
2...
sig_func : sig = 10
2...
1...
2...
1...
2...
sig_func : sig = 10
1...

一共对SIGUSR1响应了3次,分别是线程1、2、1响应的。





相关文章推荐

线程与信号

类UNIX信号以前是专为进程设计的,它比线程的出现早了很多年。当线程模型出现后,专家们试图也在线程上实现信号,这导致了一个问题:如果要在线程模型中保持原来在进程中信号语意不变,是相当困难的。 避免信...

C例子:信号量同步线程

  • 2016年01月27日 22:58
  • 3KB
  • 下载

LINUX C语言:开启一个专门用来接收信号的子线程。

以下这个小程序实现这个功能。 上代码: #include #include #include #include #include #include //程序发生了严重的错误,输出...

Qt跨线程发送信号与元数据

转载请注明出处:http://blog.csdn.net/luotuo44/article/details/39395025         Qt的signa...

pyqt通过信号槽机制来退出线程

刚刚解决了pyqt线程退出问题,特来此记录下解决的想法。以下用一个简单例子来表现如何用signal/slot信号槽来退出线程。 若有一个按钮,点击开始线程,再次点击退出线程,线程的工作为打印a(1-2...

DirectFB源代码阅读(三)线程及信号初始化

在使用DirectFB创建一个程序的时候,要执行两个初始化函数,上一篇文章讲了第一个DirectFBInit,下面几篇讲第二个DirectFBCreate. DirectFBCreate主要调用了三...

Java线程:新特征-信号量

Java线程:新特征-信号量   Java的信号量实际上是一个功能完毕的计数器,对控制一定资源的消费与回收有着很重要的意义,信号量常常用于多线程的代码中,并能监控有多少数目的线程等待获取资...

基于信号实现的用户态线程库

如何实现用户态线程库?我们可以实现类似pthread的接口么?答案是显然可以!...

Linux _ pthread 线程 信号

Linux _ pthread 线程 信号
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线程与信号
举报原因:
原因补充:

(最多只允许输入30个字)