当前位置: 首页 > news >正文

信号相关的函数

#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); -功能&#xff1a;给任何进程pid&#xff0c;发送任何信号sig 参数&#xff1a; pid: >0:将信号发送给指定的进程 0&#xff1a;将信号发送给当前的进程组 -1&#xff1a;将信号发送…...

matlab实现杨氏双缝干涉实验可视化界面

关于杨氏双缝干涉实验的条纹光强理论推导和matlab绘图可以参考下面的链接&#xff1a;杨氏双缝干涉实验matlab实现 接下来利用GUI实现可视化界面。 一、GUI GUIDE简介 1、在命令行窗口输入小写的guide可以自动弹出fig窗口。 2、界面的左侧是常用的工具&#xff0c;鼠标悬停…...

【SQL】统一训练平台数据库实践--20230927

储存过程vlookup_peopledata_csodtraining 默认导出用今天批次的数据进行join on&#xff0c;先删除过渡表的资料&#xff0c;再将查询结果放在过渡表中。 BEGINDECLARE startdate varchar(50);SET startdate date_format(NOW(),%Y%m%d);DELETE FROM season.csod_data2;INSE…...

全国职业技能大赛云计算赛项---Linux系统调优案例

全国职业技能大赛云计算赛项---Linux系统调优案例 Linux系统调优案例&#xff1a;OpenStack平台调度策略优化:OpenStack平台镜像优化&#xff1a;OpenStack平台I/O优化&#xff1a;OpenStack 平台内存优化&#xff1a;Linux 系统调优-防止SYN 攻击&#xff1a; Linux系统调优案…...

Docker部署ZooKeeper分布式协调服务

1、准备工作 docker pull zookeeper:3.6.3 Pwd"/data/software/zookeeper" mkdir -p ${Pwd}/{logs,data,conf}2、创建TEST容器&#xff0c;将conf目录COPY出来&#xff0c;在映射进去&#xff0c;方便后续维护管理&#xff01; docker run -itd --name zookeeper z…...

算法 出现次数超过一半的数字-(哈希+摩尔投票)

牛客网: BM51 题目: 数组中只有1个数字出现次数超过一半&#xff0c;找出这个数字 思路: 投票计数vote0, 遍历数组&#xff0c;vote为0时&#xff0c;num赋值为当前值, num与当前值相等时&#xff0c;vote增加, 否则vote减小&#xff0c;只有1个数字出现次数超过一半&#xf…...

如何搭建游戏平台?

搭建游戏平台是一个复杂的任务&#xff0c;涉及多个方面的工作。下面是一些关键步骤和注意事项&#xff0c;以帮助您搭建游戏平台&#xff1a; 平台开发&#xff1a;开发游戏平台的关键部分&#xff0c;包括网站或应用程序的开发、数据库设计、用户界面设计、游戏上传和管理工具…...

【华为OD机试python】数字反转打印【2023 B卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述: 小华是个很有对数字很敏感的小朋友,他觉得数字的不同排列方式有特殊美感。 某天,小华突发奇想,如果数字多行排列,第一行1个数,第二行2个,第三行3个, 即第n行有n个数字,并且奇数行…...

MATLAB配置编译器(包括vs和mingw)

版本&#xff1a;matlab2022b&#xff0c;VS2022&#xff0c;mingw&#xff1a;8.1.0 之前安装好了matlab和vs后&#xff0c;在matlab的命令行输入 mex -setup时&#xff0c;自动找到并且配置好了vs编译器&#xff0c;可能是应为二者安装在了同一个根目录下&#xff0c;比如都在…...

基本网络协议

TCP 协议 TCP 协议是一种传输控制协议&#xff0c;是一种面向连接的传输层协议,它提供高可靠性的通信高可靠性:数据无错误,数据无丢失,数据无失序,数据无重复到达。 TCP 协议头部结构 下图是 TCP 协议的头部结构&#xff0c;如图&#xff1a; 16 位端口号&#xff1a; 告知主机…...

Tungsten Fabric Rabbitmq故障处理

开源SDN软件Tungsten Fabric&#xff08;以下简称TF&#xff09;有时莫名其妙出现服务宕机情况。 使用TF自带工具contrail-status排查&#xff0c;多数时候是rabbitmq出现宕机&#xff0c;或者某个组件连接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是一款流行的多媒体播放器应用程序&#xff0c;适用于iOS、tvOS和macOS平台。它由Firecore开发&#xff0c;旨在提供出色的媒体播放体验&#xff0c;并支持广泛的视频和音频格式。 以下是Infuse的一些主要功能和特点&#xff1a; 多媒体格式支持&#xff1a;Infuse支持…...

优化积分商城页面的8个实用技巧

积分商城是私域营销的强大工具&#xff0c;能够帮助企业吸引并留住客户&#xff0c;提高销售和客户忠诚度。然而&#xff0c;为了确保积分商城发挥最大效益&#xff0c;需要对其页面进行优化&#xff0c;以提供用户友好的体验。本文将介绍8个实用的技巧&#xff0c;帮助您优化积…...

Python机器学习实战-特征重要性分析方法(2):内置特征重要性(附源码和实现效果)

实现功能 一些模型&#xff0c;如线性回归和随机森林&#xff0c;可以直接输出特征重要性分数。这些显示了每个特征对最终预测的贡献。 实现代码 from sklearn.datasets import load_breast_cancer from sklearn.ensemble import RandomForestClassifier import matplotlib.…...

vue中v-for和v-if同时使用的解决办法

在一个列表中&#xff0c;如果同时要遍历&#xff0c;并且根据某个条件控制某个列表项是否显示&#xff0c;如下代码是错误的&#xff1a; <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架构)

问题描述 树莓派信息&#xff1a;#4B# #64位# #aarch# 使用 gpio -v 或 gpio readall 命令时显示 cmmand not foung安装好 RPi.GPIO &#xff08;安装命令&#xff1a;pip install RPi.GPIO&#xff09;仍旧不能使用上述命令安装好 wiringpi 结果报错 wiringpi:armhf 原因分析…...

oracle 递归

1&#xff09;此方法&#xff0c;父亲state 9999&#xff0c;儿子state ! 9999&#xff0c;儿子能查询出来 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&#xff09;此方法…...

SSM - Springboot - MyBatis-Plus 全栈体系(十三)

第三章 MyBatis 一、MyBatis 简介 1. 简介 MyBatis 最初是 Apache 的一个开源项目 iBatis, 2010 年 6 月这个项目由 Apache Software Foundation 迁移到了 Google Code。随着开发团队转投 Google Code 旗下&#xff0c; iBatis3.x 正式更名为 MyBatis。代码于 2013 年 11 月迁…...

Python|OpenCV-访问并修改图片像素值,鉴别彩色和灰色图像(6)

前言 本文是该专栏的第6篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 在使用OpenCV对图像进行操作的时候,通常需要熟练掌握一些Numpy知识点。因为有的时候需要用到Numpy和OpenCV结合去实现图像的操作,所以说想要写出较好的OpenCV代码的最好方法,就需要有Nump…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

【C++】纯虚函数类外可以写实现吗?

1. 答案 先说答案&#xff0c;可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...

区块链技术概述

区块链技术是一种去中心化、分布式账本技术&#xff0c;通过密码学、共识机制和智能合约等核心组件&#xff0c;实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点&#xff1a;数据存储在网络中的多个节点&#xff08;计算机&#xff09;&#xff0c;而非…...

若依登录用户名和密码加密

/*** 获取公钥&#xff1a;前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...

多元隐函数 偏导公式

我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式&#xff0c;给定一个隐函数关系&#xff1a; F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 &#x1f9e0; 目标&#xff1a; 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z​、 …...