信号相关的函数
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
-功能:给任何进程pid,发送任何信号sig
参数:
pid:
>0:将信号发送给指定的进程
=0:将信号发送给当前的进程组
=-1:将信号发送给每一个有权限接收这个信号的进程
<-1:这个pid=某个进程组的ID取反(-12345)
sig:需要发送的信号的编号或者是宏值,0表示不发送任何信号
int raise(int sig);
-功能:给当前进程发送信号
-参数:
-sig:要发送的信号
-返回值:
-成功 0
-失败 非0
void abort(void);
功能:发送SIGABRT信号给当前的进程,杀死当前进程
#include<stdio.h>
#include<sys/types.h>
#include<signal.h>
#include <unistd.h>
int main() {pid_t pid = fork();if(pid == 0) {//子进程int i = 0;for(i = 0; i < 5; i++) {printf("child process\n");sleep(1);}} else if(pid > 0) {//父进程printf("parent process\n");sleep(2);printf("kill child process now\n");kill(pid, SIGINT);}return 0;
}
alarm函数
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
-功能:设置定时器。函数调用,开始倒计时,当倒计时为0的时候,函数会给当前的进程发送一个信号:SIGALARM
-参数:
seconds:倒计时的时长,单位:秒。如果参数为0,定时器无效(不进行倒计时,不发送信号)
取消一个定时器,通过alarm(0)。
-返回值:倒计时剩余的时间
-之前没有定时器,返回0
-之前有定时器,返回之前的定时器剩余的时间
-SIGALARM:默认终止当前的进程,每一个进程都有且只有唯一的一个定时器
alarm(10); ->返回0
过了1秒
alarm(5); ->返回9
该函数是不阻塞的
#include<stdio.h>
#include<unistd.h>
int main() {int ret = alarm(5);printf("ret = %d\n", ret);sleep(2);ret = alarm(10);printf("ret = %d\n", ret);while(1) {}return 0;
}
setitimer
#include <sys/time.h>
int setitimer(int which, const struct itimerval *new_value,struct itimerval *old_value);
功能:设置定时器(闹钟)。可以替代alarm函数。精度us,可以实现周期性定时
-参数:
-which:定时器以什么时间计时
-ITIMER_REAL:真实时间,时间到达,发送SIGALRM 常用
-ITIMER_VIRTUAL:用户时间,时间到达,发送SIGVTALRM
-ITIMER_PROF:以该进程在用户态和内核态下所消耗的时间来计算时间到达,发送SIGPROF
-new_value:设置定时器的属性
struct itimerval { //定时器的结构体
struct timeval it_interval; //间隔时间
struct timeval it_value; //延迟多长时间执行定时器
};
struct timeval { //时间的结构体
time_t tv_sec; //秒数
suseconds_t tv_usec; //微秒
};
-old_value:记录上一次的定时的时间参数
返回值:成功0,失败-1,设置错误号
#include<stdio.h>
#include <sys/time.h>
#include <stdlib.h>
//过3秒后,每隔2秒定时一次
int main() {struct itimerval new_value;//设置值new_value.it_interval.tv_sec = 2;new_value.it_interval.tv_usec = 0;//设置延迟的时间new_value.it_value.tv_sec = 3;new_value.it_value.tv_usec = 0;int ret = setitimer(ITIMER_REAL, &new_value, NULL);if(ret == -1) {perror("setitimer");exit(0);}getchar();return 0;
}
signal函数
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
- 功能:设置某个信号的捕捉行为
- 参数:
- signum: 要捕捉的信号
- handler: 捕捉到信号要如何处理
- SIG_IGN : 忽略信号
- SIG_DFL : 使用信号默认的行为
- 回调函数 : 这个函数是内核调用,程序员只负责写,捕捉到信号后如何去处理信号。
回调函数:
- 需要程序员实现,提前准备好的,函数的类型根据实际需求,看函数指针的定义
- 不是程序员调用,而是当信号产生,由内核调用
- 函数指针是实现回调的手段,函数实现之后,将函数名放到函数指针的位置就可以了。
- 返回值:
成功,返回上一次注册的信号处理函数的地址。第一次调用返回NULL
失败,返回SIG_ERR,设置错误号
SIGKILL SIGSTOP不能被捕捉,不能被忽略。
#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>void myalarm(int num) {printf("捕捉到了信号的编号是:%d\n", num);printf("xxxxxxx\n");
}// 过3秒以后,每隔2秒钟定时一次
int main() {// 注册信号捕捉// signal(SIGALRM, SIG_IGN);// signal(SIGALRM, SIG_DFL);// void (*sighandler_t)(int); 函数指针,int类型的参数表示捕捉到的信号的值。signal(SIGALRM, myalarm);struct itimerval new_value;// 设置间隔的时间new_value.it_interval.tv_sec = 2;new_value.it_interval.tv_usec = 0;// 设置延迟的时间,3秒之后开始第一次定时new_value.it_value.tv_sec = 3;new_value.it_value.tv_usec = 0;int ret = setitimer(ITIMER_REAL, &new_value, NULL); // 非阻塞的printf("定时器开始了...\n");if(ret == -1) {perror("setitimer");exit(0);}getchar();return 0;
}
sigaction函数


1.用户通过键盘 Ctrl + C, 产生2号信号SIGINT (信号被创建)
2.信号产生但是没有被处理 (未决)
- 在内核中将所有的没有被处理的信号存储在一个集合中 (未决信号集)
- SIGINT信号状态被存储在第二个标志位上
- 这个标志位的值为0, 说明信号不是未决状态
- 这个标志位的值为1, 说明信号处于未决状态
3.这个未决状态的信号,需要被处理,处理之前需要和另一个信号集(阻塞信号集),进行比较
- 阻塞信号集默认不阻塞任何的信号
- 如果想要阻塞某些信号需要用户调用系统的API
4.在处理的时候和阻塞信号集中的标志位进行查询,看是不是对该信号设置阻塞了
- 如果没有阻塞,这个信号就被处理
- 如果阻塞了,这个信号就继续处于未决状态,直到阻塞解除,这个信号就被处理
#include <signal.h>
#include <stdio.h>int main() {// 创建一个信号集sigset_t set;// 清空信号集的内容sigemptyset(&set);// 判断 SIGINT 是否在信号集 set 里int ret = sigismember(&set, SIGINT);if(ret == 0) {printf("SIGINT 不阻塞\n");} else if(ret == 1) {printf("SIGINT 阻塞\n");}// 添加几个信号到信号集中sigaddset(&set, SIGINT);sigaddset(&set, SIGQUIT);// 判断SIGINT是否在信号集中ret = sigismember(&set, SIGINT);if(ret == 0) {printf("SIGINT 不阻塞\n");} else if(ret == 1) {printf("SIGINT 阻塞\n");}// 判断SIGQUIT是否在信号集中ret = sigismember(&set, SIGQUIT);if(ret == 0) {printf("SIGQUIT 不阻塞\n");} else if(ret == 1) {printf("SIGQUIT 阻塞\n");}// 从信号集中删除一个信号sigdelset(&set, SIGQUIT);// 判断SIGQUIT是否在信号集中ret = sigismember(&set, SIGQUIT);if(ret == 0) {printf("SIGQUIT 不阻塞\n");} else if(ret == 1) {printf("SIGQUIT 阻塞\n");}return 0;
}
sigpromask
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
- 功能:将自定义信号集中的数据设置到内核中(设置阻塞,解除阻塞,替换)
- 参数:
- how : 如何对内核阻塞信号集进行处理
SIG_BLOCK: 将用户设置的阻塞信号集添加到内核中,内核中原来的数据不变
假设内核中默认的阻塞信号集是mask, mask | set
SIG_UNBLOCK: 根据用户设置的数据,对内核中的数据进行解除阻塞
mask &= ~set
SIG_SETMASK:覆盖内核中原来的值
- set :已经初始化好的用户自定义的信号集
- oldset : 保存设置之前的内核中的阻塞信号集的状态,可以是 NULL
- 返回值:
成功:0
失败:-1
设置错误号:EFAULT、EINVAL
int sigpending(sigset_t *set);
- 功能:获取内核中的未决信号集
- 参数:set,传出参数,保存的是内核中的未决信号集中的信息。
// 编写一个程序,把所有的常规信号(1-31)的未决状态打印到屏幕
// 设置某些信号是阻塞的,通过键盘产生这些信号#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>int main() {// 设置2、3号信号阻塞sigset_t set;sigemptyset(&set);// 将2号和3号信号添加到信号集中sigaddset(&set, SIGINT);sigaddset(&set, SIGQUIT);// 修改内核中的阻塞信号集sigprocmask(SIG_BLOCK, &set, NULL);int num = 0;while(1) {num++;// 获取当前的未决信号集的数据sigset_t pendingset;sigemptyset(&pendingset);sigpending(&pendingset);// 遍历前32位for(int i = 1; i <= 31; i++) {if(sigismember(&pendingset, i) == 1) {printf("1");}else if(sigismember(&pendingset, i) == 0) {printf("0");}else {perror("sigismember");exit(0);}}printf("\n");sleep(1);if(num == 10) {// 解除阻塞sigprocmask(SIG_UNBLOCK, &set, NULL);}}return 0;
}
相关文章:
信号相关的函数
#include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig); -功能:给任何进程pid,发送任何信号sig 参数: pid: >0:将信号发送给指定的进程 0:将信号发送给当前的进程组 -1:将信号发送…...
matlab实现杨氏双缝干涉实验可视化界面
关于杨氏双缝干涉实验的条纹光强理论推导和matlab绘图可以参考下面的链接:杨氏双缝干涉实验matlab实现 接下来利用GUI实现可视化界面。 一、GUI GUIDE简介 1、在命令行窗口输入小写的guide可以自动弹出fig窗口。 2、界面的左侧是常用的工具,鼠标悬停…...
【SQL】统一训练平台数据库实践--20230927
储存过程vlookup_peopledata_csodtraining 默认导出用今天批次的数据进行join on,先删除过渡表的资料,再将查询结果放在过渡表中。 BEGINDECLARE startdate varchar(50);SET startdate date_format(NOW(),%Y%m%d);DELETE FROM season.csod_data2;INSE…...
全国职业技能大赛云计算赛项---Linux系统调优案例
全国职业技能大赛云计算赛项---Linux系统调优案例 Linux系统调优案例:OpenStack平台调度策略优化:OpenStack平台镜像优化:OpenStack平台I/O优化:OpenStack 平台内存优化:Linux 系统调优-防止SYN 攻击: Linux系统调优案…...
Docker部署ZooKeeper分布式协调服务
1、准备工作 docker pull zookeeper:3.6.3 Pwd"/data/software/zookeeper" mkdir -p ${Pwd}/{logs,data,conf}2、创建TEST容器,将conf目录COPY出来,在映射进去,方便后续维护管理! docker run -itd --name zookeeper z…...
算法 出现次数超过一半的数字-(哈希+摩尔投票)
牛客网: BM51 题目: 数组中只有1个数字出现次数超过一半,找出这个数字 思路: 投票计数vote0, 遍历数组,vote为0时,num赋值为当前值, num与当前值相等时,vote增加, 否则vote减小,只有1个数字出现次数超过一半…...
如何搭建游戏平台?
搭建游戏平台是一个复杂的任务,涉及多个方面的工作。下面是一些关键步骤和注意事项,以帮助您搭建游戏平台: 平台开发:开发游戏平台的关键部分,包括网站或应用程序的开发、数据库设计、用户界面设计、游戏上传和管理工具…...
【华为OD机试python】数字反转打印【2023 B卷|100分】
【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述: 小华是个很有对数字很敏感的小朋友,他觉得数字的不同排列方式有特殊美感。 某天,小华突发奇想,如果数字多行排列,第一行1个数,第二行2个,第三行3个, 即第n行有n个数字,并且奇数行…...
MATLAB配置编译器(包括vs和mingw)
版本:matlab2022b,VS2022,mingw:8.1.0 之前安装好了matlab和vs后,在matlab的命令行输入 mex -setup时,自动找到并且配置好了vs编译器,可能是应为二者安装在了同一个根目录下,比如都在…...
基本网络协议
TCP 协议 TCP 协议是一种传输控制协议,是一种面向连接的传输层协议,它提供高可靠性的通信高可靠性:数据无错误,数据无丢失,数据无失序,数据无重复到达。 TCP 协议头部结构 下图是 TCP 协议的头部结构,如图: 16 位端口号: 告知主机…...
Tungsten Fabric Rabbitmq故障处理
开源SDN软件Tungsten Fabric(以下简称TF)有时莫名其妙出现服务宕机情况。 使用TF自带工具contrail-status排查,多数时候是rabbitmq出现宕机,或者某个组件连接rabbitmq出错。 本次仅排查、处理rabbitmq问题。 1. 查rabbitmq日志发…...
sqlServer 检测慢 sql
部署监控: 部署慢SQL与死锁跟踪 Skip to end of metadata 仅SQL Server 2012及以上版本可用. 执行前请确保路径正确! 慢SQL定义:执行时间超过0.5秒即定义为慢SQL,会被捕获。 SSMS中新建查询窗口,将下面代码贴上后执行。 该代码会新建一个[YX_Monitor]库,库中包含[Deadloc…...
Mac电脑音视频播放器: Infuse for Mac中文
Infuse是一款流行的多媒体播放器应用程序,适用于iOS、tvOS和macOS平台。它由Firecore开发,旨在提供出色的媒体播放体验,并支持广泛的视频和音频格式。 以下是Infuse的一些主要功能和特点: 多媒体格式支持:Infuse支持…...
优化积分商城页面的8个实用技巧
积分商城是私域营销的强大工具,能够帮助企业吸引并留住客户,提高销售和客户忠诚度。然而,为了确保积分商城发挥最大效益,需要对其页面进行优化,以提供用户友好的体验。本文将介绍8个实用的技巧,帮助您优化积…...
Python机器学习实战-特征重要性分析方法(2):内置特征重要性(附源码和实现效果)
实现功能 一些模型,如线性回归和随机森林,可以直接输出特征重要性分数。这些显示了每个特征对最终预测的贡献。 实现代码 from sklearn.datasets import load_breast_cancer from sklearn.ensemble import RandomForestClassifier import matplotlib.…...
vue中v-for和v-if同时使用的解决办法
在一个列表中,如果同时要遍历,并且根据某个条件控制某个列表项是否显示,如下代码是错误的: <ul><li v-for"item in list" v-if"item.show" :key"item.id">{{item.name}}</li> &…...
【解决方法】树莓派4B安装wiringpi失败、gpio -v与gpio readall命令not found(arm64架构)
问题描述 树莓派信息:#4B# #64位# #aarch# 使用 gpio -v 或 gpio readall 命令时显示 cmmand not foung安装好 RPi.GPIO (安装命令:pip install RPi.GPIO)仍旧不能使用上述命令安装好 wiringpi 结果报错 wiringpi:armhf 原因分析…...
oracle 递归
1)此方法,父亲state 9999,儿子state ! 9999,儿子能查询出来 select * from T_ORGANIZATION ot where ot.state!9999 start with ot.id 7 connect by prior ot.id ot.ORG_PARENTID order by ot.id asc 2)此方法…...
SSM - Springboot - MyBatis-Plus 全栈体系(十三)
第三章 MyBatis 一、MyBatis 简介 1. 简介 MyBatis 最初是 Apache 的一个开源项目 iBatis, 2010 年 6 月这个项目由 Apache Software Foundation 迁移到了 Google Code。随着开发团队转投 Google Code 旗下, iBatis3.x 正式更名为 MyBatis。代码于 2013 年 11 月迁…...
Python|OpenCV-访问并修改图片像素值,鉴别彩色和灰色图像(6)
前言 本文是该专栏的第6篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 在使用OpenCV对图像进行操作的时候,通常需要熟练掌握一些Numpy知识点。因为有的时候需要用到Numpy和OpenCV结合去实现图像的操作,所以说想要写出较好的OpenCV代码的最好方法,就需要有Nump…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...
