栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Linux线程间通信之信号(十八)

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux线程间通信之信号(十八)

Linux线程间通信之信号(十八)
  • 1.Linux线程间通信之信号
  • 2.信号安装函数
  • 3.添加所有信号到信号集函数
  • 4.添加一个信号到信号集函数
  • 5.初始化信号集函数
  • 6.向线程发送信号函数
  • 7.更改或检查调用线程的信号掩码函数
  • 8.参考代码:

1.Linux线程间通信之信号

在linux下,每个进程都有自己的signal mask,这个信号掩码指定哪个信号被阻塞,哪个不会被阻塞,通常用调用sigmask来处理。同时每个进程还有自己的signal action,这个行为集合指定了信号该如何处理,通常调用sigaction来处理。

2.信号安装函数
	int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact);

功能:
指定的信号编号来设置该信号的处理函数。

参数:
signum:信号编号。
act:指向结构sigaction的一个实例的指针。
oldact:用来保存原来对信号的处理,可以为NULL。

返回值:
成功:0。
失败: -1。

3.添加所有信号到信号集函数
	int sigfillset(sigset_t * set);

功能:
sigfillset()用来将参数set信号集初始化,然后把所有的信号加入到此信号集里。

参数:
set:信号集标识的地址,以后操作此信号集,对 set 进行操作就可以。

返回值:
成功:0。
失败: -1。

4.添加一个信号到信号集函数
	int sigaddset(sigset_t *set, int signum);

功能:
添加一个的信号加入到此信号集里。

参数:
set:信号集标识的地址,以后操作此信号集,对 set 进行操作就可以。
signum:信号编号。

返回值:
成功:0。
失败: -1。

5.初始化信号集函数
	int sigemptyset(sigset_t *set);

功能:
初始化信号集。

参数:
set:信号集标识的地址,以后操作此信号集,对 set 进行操作就可以。

返回值:
成功:0。
失败: -1。

6.向线程发送信号函数
	int pthread_kill(thread_t tid, int sig);

功能:
向线程发送信号。

参数:
tid:线程ID。
sig:信号编号。

返回值:
成功:0。
失败: -1。

7.更改或检查调用线程的信号掩码函数
	int pthread_sigmask(int how, const sigset_t *act, sigset_t *oldact);

功能:
更改或检查调用线程的信号掩码。

参数:
how:向当前的信号掩码中添加或删除或替换set。
act:信号屏蔽字。
oldact:为NULL,即可。

how说明:
SIG_BLOCK: 结果集是当前集合参数集的并集(把参数set中的信号添加到信号屏蔽字中)
SIG_UNBLOCK: 结果集是当前集合参数集的差集(把信号屏蔽字设置为参数set中的信号)
SIG_SETMASK: 结果集是由参数集指向的集(从信号屏蔽字中删除参数set中的信号)

返回值:
成功:0。
失败: -1。

8.参考代码:
//=============================================================================
// File Name    : thread_signal.c
// Author       : FengQQ
//
// Description  : 信号
// Annotation   : 
//
//	int pthread_kill(pthread_t thread,int sig);
//	向线程thread发送sig信号,成功返回0,失败返回错误码
//
//	int sigaction(int signum,const truct sigaction *act,struct sigaction *oldact);
//	为信号signum设置处理函数,处理函数在sigaction中指定
//	act.sa_mask 信号屏蔽字
//	act.sa_handler 信号集处理程序	
//
//	int pthread_sigmask(int how,const sigset_t *set,sigset_t *oldset);
//	多线程信号屏蔽函数
//	how = SIG_BLOCK:向当前的信号掩码中添加set,其中set表示要取消阻塞的信号组。
//	SIG_UNBLOCK: 向当前的信号掩码中删除set,其中set表示要取消阻塞的信号组。
//	SIG_SETMASK: 将当前的信号掩码替换为set,其中set表示新的信号掩码。
//	在多线程中,新线程的当前信号掩码会继承创造它的线程的信号掩码
//
// Created by FengQQ. 2020-10-05
//=============================================================================
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

//-------------信号回调函数1-----------------
void sig_handler1(int arg)
{
	printf("pthread1 get signalrn");
	return;
}
//-------------信号回调函数2-----------------
void sig_handler2(int arg)
{
	printf("pthread2 get signalrn");
	return;
}
//---------------线程函数1------------------
void *pthread1_callback(void *arg)
{
	struct sigaction act;
	
	printf("new pthread 1rn");
	
	memset(&act,0,sizeof(act));						//将act的内存空间填入0
	sigaddset(&act.sa_mask,SIGQUIT);				//添加一个信号至信号集
	act.sa_handler = sig_handler1;
	sigaction(SIGQUIT,&act,NULL);					//查询或设置信号处理方式
	pthread_sigmask(SIG_BLOCK,&act.sa_mask,NULL);
	sleep(2);
}
//---------------线程函数2------------------
void *pthread2_callback(void *arg)
{       
	struct sigaction act;
	
	printf("new pthread 2rn");      

	memset(&act,0,sizeof(act));					//将act的内存空间填入0	
	sigaddset(&act.sa_mask,SIGQUIT);			//添加一个信号至信号集
	act.sa_handler = sig_handler2;	
	sigaction(SIGQUIT,&act,NULL);				//查询或设置信号处理方式
	
	//pthread_sigmask(SIG_BLOCK,&act.sa_mask,NULL);
	sleep(2);
}

int main(int argc,char *argv[])
{
	int ret;
	int signal_value;
	pthread_t ptid1,ptid2;
	
	ret = pthread_create(&ptid1,NULL,pthread1_callback,NULL);
	if(ret != 0)
	{
		printf("create new pthread1 failed...rn");
		return -1;
	}	
	ret = pthread_create(&ptid2,NULL,pthread2_callback,NULL);
	if(ret != 0)
	{
		printf("create new pthread2 failed...rn");
		return -1;
	}
	
	sleep(1);
	
	signal_value = pthread_kill(ptid1,SIGQUIT);
	if(signal_value != 0)
	{
		printf("send signal to thread1 failed...rn");
	}
	
	signal_value = pthread_kill(ptid2,SIGQUIT);
	if(signal_value != 0)
	{
		printf("send signal to thread2 failed...rn");
	}	
	
	ret  = pthread_join(ptid1,NULL);
	if(ret != 0)
	{
		printf("pthread1 join failed...rn");
	}	
	ret  = pthread_join(ptid2,NULL);
	if(ret != 0)
	{
		printf("pthread2 join failed...rn");
	}
	
	return 0;
}

Linux线程间通信之信号量(十九)

链接: link.(https://blog.csdn.net/qq_39721016/article/details/120604654?spm=1001.2014.3001.5501)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/291649.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号