UC编程8-信号发送函数kill/raise/setitimer/alarm和信号集函数segprocmask

简介: //myuc.h #include//io流#include//标准库#include//uc标准头文件#include//文件控制#include//c字符串#include#include//内存映射#include//文件...

//myuc.h

#include<stdio.h>//io流
#include<stdlib.h>//标准库
#include<unistd.h>//uc标准头文件
#include<fcntl.h>//文件控制
#include<string.h>//c字符串
#include<sys/types.h>
#include<sys/mman.h>//内存映射
#include<sys/stat.h>//文件状态信息
#include<sys/wait.h>//进程等等
#include<dirent.h>//目录操作
#include<signal.h>//信号
#include<sys/time.h>//时间,计时器
#include<sys/ipc.h>//ipc进程间通信
#include<sys/shm.h>//共享内存段
#include<sys/msg.h>//消息队列


//8itimer.c

#include "myuc.h"
void fa(int signo){
printf("get signo %d\n",signo);
}
void test1(){
	signal(SIGALRM,fa);
	struct itimerval timer;
	timer.it_interval.tv_sec=3;//循环时间
	timer.it_interval.tv_usec=100000;//0.1秒
	timer.it_value.tv_sec=2;//开始时间
	timer.it_value.tv_usec=100000;
	setitimer(ITIMER_REAL,&timer,NULL);
	//设定循环向本进程发送SIGALRM信号。
	while(1);
}
void test2(){

}
int main()
{
	test1();
	test2();
	return 0;
}

//8killalarm.c

#include "myuc.h"
void fa(int signal){
	printf("pid:%d catched signal %d\n",getpid(),signal);
	if(signal==SIGALRM){
	printf("闹钟信号\n");
	alarm(2);
	}
}
//raise发信号
void test1(){
	signal(SIGINT,fa);
	raise(SIGINT);//给自己发信号
	int lefts=sleep(3);//时间到或者非忽略信号到来时,就执行后面的代码
	usleep(3000000);// 微妙,10(-6次方),不会被信号打断
	if(lefts!=0) printf("lefts=%d\n",lefts);//lefts为sleep的剩余秒数
	raise(SIGQUIT);
	while(1);
}
//kill发信号
void test2(){
pid_t pid=fork();
if(pid==0){
	signal(SIGINT,fa);
	printf("child:pid=%d\n",getpid());
	//while(1);
	sleep(10);
	printf("child end\n");
	exit(1);
}
sleep(1);
printf("send signal\n");
kill(pid,SIGINT);
sleep(2);
printf("father end\n");
}
//闹钟信号
void test3(){
	
	signal(SIGALRM,fa);
	alarm(10);
	sleep(1);
	int res=alarm(5);//返回上一个闹钟剩余秒数
	printf("res=%d\n",res);
	sleep(1);
	res=alarm(2);//alarm秒数到了,才发出信号
	printf("res=%d\n",res);
	while(1);
}
int main()
{
	//test1();
	//test2();
	test3();
	return 0;
}

//8sigaction.c

#include "myuc.h"
void fa(int signo){
	printf("catched signal %d\n",signo);
	sleep(2);
	printf("sleep end\n");
}
void fa2(int signo,siginfo_t * info,void * p){
printf("catched signal %d from %d\n",signo,info->si_pid);
}
void fa3(int signo,siginfo_t * info,void * p){
printf("catched signal %d from %d,data:%d\n",
		signo,info->si_pid,info->si_value);
}
void test1(){
	struct sigaction act={};
	act.sa_handler=fa;//函数指针
	sigemptyset(&act.sa_mask);
	sigaddset(&act.sa_mask,3);
	act.sa_flags=SA_NOMASK|SA_RESETHAND;
	//不屏蔽自身|执行一次恢复默认
	sigaction(SIGINT,&act,NULL);
	while(1);
}
void test2(){
	printf("mypid=%d\n",getpid());
	struct sigaction act={};
	act.sa_sigaction=fa2;//函数指针
	sigemptyset(&act.sa_mask);
	
	act.sa_flags=SA_NOMASK|SA_SIGINFO;
	//不屏蔽自身|执行一次恢复默认
	sigaction(SIGINT,&act,NULL);
	while(1);
}
void test3(){
	printf("mypid=%d\n",getpid());
	struct sigaction act={};
	act.sa_sigaction=fa3;//函数指针
	sigemptyset(&act.sa_mask);
	
	act.sa_flags=SA_NOMASK|SA_SIGINFO;
	//不屏蔽自身|使用sa_sigaction函数处理
	sigaction(/*SIGINT*/40,&act,NULL);
	pid_t pid=fork();
	if(pid==0){
		int i;
		for(i=0;i<20;i++)
		{
			union sigval v;
			v.sival_int=i;
			sigqueue(getppid(),/*2*/40,v);//给父进程发信号,带数据
		}
		exit(1);
	}
	while(1);
}
int main()
{
	//test1();
	//test2();
	test3();
	return 0;
}

//8sigset.c

#include "myuc.h"
void fa(int signo){
printf("catched signal %d\n",signo);
}
//信号集合操作
void test1(){
printf("size=%d\n",sizeof(sigset_t));
sigset_t set;
printf("set=%g\n",set);
sigemptyset(&set);
printf("set=%d\n",set);
sigaddset(&set,2);//倒数第2位置1
printf("set=%d\n",set);
sigaddset(&set,3);//倒数第3位置1
printf("set=%d\n",set);
if(sigismember(&set,2)){
	printf("signal 2 exist\n");
}
}
//信号屏蔽和解除
void test2(){
signal(SIGINT,fa);
signal(SIGQUIT,fa);
signal(40,fa);//自定义处理40的信号
printf("pid=%d\n",getpid());
printf("信号没屏蔽\n");
sleep(10);
printf("信号屏蔽\n");
sigset_t set,oldset;
sigemptyset(&set);
sigaddset(&set,2);sigaddset(&set,3);//不可靠信号,多种相同信号只保留一个
sigaddset(&set,40);//可靠信号
sigprocmask(SIG_SETMASK,&set,&oldset);
sleep(5);
printf("获取屏蔽期收到的信号\n");
sigset_t recset;
sigpending(&recset);//接收屏蔽期间收到过的信号集合,不能获取次数
if(sigismember(&recset,2)){
	printf("接收到信号2\n");
}
else{
	printf("没收到信号2\n");
}
printf("屏蔽解除\n");
sigprocmask(SIG_SETMASK,&oldset,NULL);//解除屏蔽之后,会处理之前接收到的信号

}
int main()
{
 	//test1();
	test2();
	return 0;
}


相关文章
|
机器学习/深度学习 人工智能 数据可视化
什么是条件生成对抗性网络?
什么是条件生成对抗性网络?
502 0
|
SQL 前端开发 搜索推荐
【Element-UI】实现动态树、数据表格及分页效果
在现代软件开发中,动态树、数据表格以及分页效果成为了许多应用的核心需求。随着业务规模和复杂性的增加,我们往往需要展示大量的层级结构数据,并且实现交互性强且高效的操作。 动态树提供了一种组织结构清晰、可伸缩的展示方式,使用户可以方便地查看和操作树节点。数据表格则是以表格形式呈现数据,在其中用户可以进行排序、筛选、编辑等操作。 而分页效果则能够将大量数据分割成易于管理和浏览的一页或一页的内容。这三种功能的结合,不仅使得我们能够更好地处理庞大的数据集合,同时也使得用户能够快速定位所需信息。 本文将介绍如何使用现代前端技术实现动态树、数据表格及分页
|
9月前
|
人工智能 负载均衡 数据可视化
Deepseek太卡,白嫖阿里云Deepseek-R1满血版,免费100万Token
阿里云推出DeepSeek-R1 671B满血版免费部署方案,解决服务器繁忙问题。通过百炼大模型平台,用户可获得100万免费Token,无需编码,最快5分钟完成部署。支持自动弹性扩展,提供API调用和Chatbox客户端配置,轻松实现DeepSeek自由。新手零基础也能快速上手,最低0元体验高性能AI模型。
|
算法 应用服务中间件 nginx
NGINX下的红黑树源码详解(附 流程图和GIF)(1)
之前博主稍微讲解了下红黑树的原理,那么在这篇博客博主想要把红黑树讲的更加的透彻,以便于更多的人了解红黑树 (本博客会更加详细的介绍之前的博客没介绍到的,所以各位看官不同再回去翻看博主之前那篇红黑树的原理讲解了。)
271 3
ly~
|
存储 SQL NoSQL
数据库介绍
数据库是组织、存储和管理数据的仓库,分为关系型(RDBMS)和非关系型(NoSQL)。RDBMS 如 MySQL、Oracle 和 SQL Server 通过表间关系存储结构化数据;NoSQL 包括 MongoDB、Redis 和 Neo4j,处理非结构化数据。数据库功能组件有数据定义语言(DDL)、数据操作语言(DML)和数据库管理系统(DBMS)。应用场景涵盖企业资源规划(ERP)、电子商务和大数据分析,支持自动化管理、数据分析及决策支持。
ly~
285 3
|
机器学习/深度学习 数据可视化 TensorFlow
使用卷积神经网络构建一个图像分类模型
使用卷积神经网络构建一个图像分类模型
334 0
|
并行计算 API 数据处理
GPU(图形处理单元)因其强大的并行计算能力而备受关注。与传统的CPU相比,GPU在处理大规模数据密集型任务时具有显著的优势。
GPU(图形处理单元)因其强大的并行计算能力而备受关注。与传统的CPU相比,GPU在处理大规模数据密集型任务时具有显著的优势。
YOLOv8改进 | SAConv可切换空洞卷积(附修改后的C2f+Bottleneck)
YOLOv8改进 | SAConv可切换空洞卷积(附修改后的C2f+Bottleneck)
694 0
|
存储 自然语言处理 监控
ElasticSearch第三讲:ES详解 - Elastic Stack生态和场景方案
ElasticSearch第三讲:ES详解 - Elastic Stack生态和场景方案
374 0