进程间通信——信号

news2024/11/26 18:39:25

目录

1 概念

2 信号类型 

linux的基本信号类型

操作 常用的信号

3 怎么操作信号

signal

 kill

raise

alarm

pause

注意

范例1(自己用信号发送书写sleep函数实现定时炸弹) 

范例2(用信号发送书写功能检测用户是否输入,如果用户3s内没有输入,则超时一次,如果超时  3次则自动退出。)


 

1 概念

进程间通信,用来发送通知(异步通信,中断)

内核层给用户层传递消息,通过发送信号实现

硬件

同步通信:发送端和接收端,使用同一时钟通信
异步通信:发送端和接收端使用不同时钟通信

软件

同步通信:按照指定的顺序进行运行
异步通信:一种随机事件,在程序编写阶段不能够确定事件发生的时机

2 信号类型 

 linux的基本信号类型

操作 常用的信号

        2)SIGINT:中断信号(可以在终端按ctrl + c输入)
        3)SIGQUIT:退出信号(可以在终端按ctrl + \输入)
        9)SIGKILL:杀死信号
        11)SIGSEGV:段错误信号
        13)SIGPIPE:管道破裂信号
        14)SIGALRM:定时信号
        17)SIGCHLD:当前进程有子进程结束(子进程结束,操作系统会给父进程发送SIGCHLD)
        18)SIGCONT:继续执行信号
        19)SIGSTOP:暂停信号
        29)SIGIO:异步IO信号
        20)SIGTSTP:挂起信号(可以在终端按ctrl + z输入)

 

         10) SIGUSR1        专门预留给程序员使用的未定义信号。
         12 )SIGUSR2        专门预留给程序员使用的未定义信号。

3 怎么操作信号

信号发送方

用以下函数实现操作
    kill
    raise
    alarm
    pause
    ...
信号接收方
每个进程都会对信号做出默认响应,但是不是唯一响应。
一般对信号的处理方法有三种:
                1.缺省 
                    按照默认方式处理信号
                2.忽略
                    不处理信号
                3.捕捉
                    按照自定义方式处理信号
特殊的:9)SIGKILL和19)SIGSTOP        不能被忽略和捕捉 

signal

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

功能:

注册一个信号并设置信号的处理方式
参数:
signum:信号的编号
handler:信号的处理方式  捕获
SIG_IGN  忽略
SIG_DFL  缺省
信号对应的处理函数地址
返回值:
成功返回上一次注册的信号处理函数
失败返回SIG_ERR 

 kill

int kill(pid_t pid, int sig);

功能:
给进程发送信号
参数:
pid:进程的ID号
sig:信号的Id
返回值:
成功返回0
失败返回-1 

raise

int raise(int sig);

功能:
给自己发送一个sig信号
参数:
sig:信号的ID
返回值:
成功返回0
失败返回-1 

alarm

unsigned int alarm(unsigned int seconds);

功能:
过seconds秒后给自己发送一个SIGALRM信号
参数:
seconds:过seconds秒后发送信号 
返回值:
上次定时剩余的时间

比如:alarm(0);

关闭定时 

 pause

int pause(void);

功能:
让调用pause的进程或线程挂起
参数:

缺省void
返回值:
失败返回-1  

注意

注意:
1.pause挂起后,收到信号才能被唤醒
2.信号不能按默认方式处理,否则进程任务会结束,应该改为捕捉信号 

范例1(自己用信号发送书写sleep函数实现定时炸弹) 

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <semaphore.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/shm.h>

void handle(int arg)
{
     
}
int Mysleep(int n)
{
     signal(SIGALRM, handle);
     int i = alarm(n);
     pause();
     return 0;
}
int main(int argc, char const *argv[])
{
     int i = 10;
     while(i--)
     {
          printf("炸弹%d秒后爆炸\n",i);
          Mysleep(1);
     }
     printf("爆炸\n");
     return 0;
}

 一秒打印一句

 范例2(用信号发送书写功能检测用户是否输入,如果用户3s内没有输入,则超时一次,如果超时3次则自动退出。)

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <semaphore.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/shm.h>

int times = 3;
void handle(int arg)
{    
     if(0 == times)
     {
          exit(0);
     }
     else
     {
          times--;
          printf("你还有%d次输入机会\n",times);
          alarm(3);
     }
}
int main(int argc, char const *argv[])
{
     char tmp[1024] = {0};
     signal(SIGALRM,handle);

     while (1)
     {
          alarm(3);
          fgets(tmp,sizeof(tmp),stdin);
          times = 3;
     }
     return 0;
}

 运行结果可以看到,我只要三秒不输入就会扣除一次输入机会,倘若输入了,就会重新又三次机会,如果三次机会后都没有输入就会退出程序。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/143431.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OAuth2.0协议流程与授权模式、协议流程

什么是OAuth2.0OAuth&#xff08;Open Authorization&#xff09;是一个关于授权&#xff08;authorization&#xff09;的开放网络标准&#xff0c;允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息&#xff0c;而不需要将用户名和密码提供给第三方移动应用或分…

Java 如何优雅的导出 Excel

前言 公司项目最近有一个需要&#xff1a;报表导出。整个系统下来&#xff0c;起码超过一百张报表需要导出。这个时候如何优雅的实现报表导出&#xff0c;释放生产力就显得很重要了。下面主要给大家分享一下该工具类的使用方法与实现思路。 实现的功能点 对于每个报表都相同…

看零信任如何基于PKI体系实现数字信任

谈到安全&#xff0c;在万物互联的数字世界里&#xff0c;生活和工作之间的界限正在变得越来越模糊&#xff0c;传统的边界不再适用&#xff0c;传统的安全手段也不再适用。数字转型的步伐虽在不断加速&#xff0c;但威胁载体也在不断发展壮大&#xff0c;在数字互动过程中&…

从0到1完成一个Vue后台管理项目(三、使用SCSS/LESS,安装图标库)

往期 从0到1完成一个Vue后台管理项目&#xff08;一、创建项目&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;二、使用element-ui&#xff09; 安装CSS预处理器 Sass cnpm i sass-loader7 node-sass4 -S 安装完就可以使用了&#xff0c;通过lang的方式 这里注意自…

C#,桌面编程入门(01)——按钮Button属性与事件、动态创建、快捷键、控件数组及自定义Button

本文是《桌面编程入门》系列文章的开山之篇。《桌面编程入门》系列文章主要介绍桌面编程的各种组件&#xff0c;Button&#xff0c;ComboBox&#xff0c;Panel&#xff0c;WebBrowser。。。。。。类似的文章非常多&#xff0c;深度不同&#xff0c;水平不等。1 桌面编程1.1 图形…

第六天作业部分

使用的文件内容 1&#xff1a;passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shut…

0. 【R、Rstudio、Rtools 】软件的安装 + 在Rstudio上永久修改(默认工作路径 + 默认安装包路径)

文章目录1.R软件安装2. Rstudio的安装3. Rtools 的安装4. 初始化Rstudio4.1 更改Rtudio的镜像为中国清华大学&#xff0c;下载包更快4.2. 修改默认工作路径 默认安装包路径全部都在官网下&#xff0c;都是免费的 1.R软件安装 访问官网&#xff1a;https://www.r-project.org/ …

React(coderwhy)- 04(css)

React中CSS的概述 组件化天下的CSS ◼ 前面说过&#xff0c;整个前端已经是组件化的天下&#xff1a;  而CSS的设计就不是为组件化而生的&#xff0c;所以在目前组件化的框架中都在需要一种合适的CSS解决方案。 ◼ 在组件化中选择合适的CSS解决方案应该符合以下条件&#xff…

为外贸软件花钱前,需要考虑的几大因素

当外贸企业发展壮大到一定程度时&#xff0c;购买一款适合公司、产品、业务的办公软件帮助员工更好的处理工作是必然的选择。如何挑选一款真正便捷高效的软件产品&#xff0c;特别是在花费几万甚至十几万购买外贸软件之前&#xff0c;一定要谨慎考虑以下几个问题。 一、使用便捷…

如何选择合适的文档管理解决方案?

如何选择合适的文档管理解决方案&#xff1f; 合适的文档管理解决方案有助于保护您的数据、数字化纸质流程、保持业务连续性、满足合规性标准并为审计做好准备。 但并非所有文档管理解决方案都相同 —— 要真正实现这些好处&#xff0c;您需要一个满足某些条件的系统。 文档管…

【Linux修炼】12.深入了解系统文件

每一个不曾起舞的日子&#xff0c;都是对生命的辜负。 文件fd一. 重新谈论文件1. 共识的问题2. 重谈C语言文件操作2.1 概要2.2 C语言文件实操2.3 OS接口open的使用&#xff08;比特位标记&#xff09;2.4 写入操作2.5 追加操作2.6 只读操作二. 如何理解文件1. 提出问题2. 文件描…

Java 空指针异常的若干解决方案

Java 中任何对象都有可能为空&#xff0c;当我们调用空对象的方法时就会抛出 NullPointerException 空指针异常&#xff0c;这是一种非常常见的错误类型。我们可以使用若干种方法来避免产生这类异常&#xff0c;使得我们的代码更为健壮。本文将列举这些解决方案&#xff0c;包括…

实验十六 BGP协议基本配置

实验十六 BGP协议基本配置边界网关协议BGP(Border Gateway Protocol)是一种实现自治系统AS(Autonomous System) 之间的路由可达&#xff0c;并选择最佳路由的距离矢量路由协议。 自治系统AS (Autonomous System) AS是指在一个实体管辖下的拥有相同选路策略的IP网络。BGP网络中的…

Vue3 实现验证码倒计时

前言 倒计时的运用场景&#xff1a;获取手机验证码倒计时、获取邮箱验证码倒计时等场景&#xff0c;废话不多说&#xff0c;开始吧。 实现效果 实现代码 html&#xff08;重要部分&#xff09; <template><el-button v-if"!sms.disabled" color"#f…

通达信l2接口如何用?

在股票量化投资领域中&#xff0c;通达信l2接口如何用的知识也是要知道和了解的&#xff0c;像现在特别多的团队已经开发有多种不一样的数据接口系统&#xff0c;主要是方便大家去查询行情的时候&#xff0c;能够很快的从这些l2数据接口中产生数据&#xff0c;直观的显示数据的…

酷早报:2023年1月6日全球Web3加密行业重大资讯大汇总

2023年1月6日 星期五 【数据指标】 加密货币总市值&#xff1a;$0.82万亿 BTC市值占比&#xff1a;39.42% 恐慌贪婪指数&#xff1a;26 恐慌【今日快讯】 1、【政讯】 1.1.1、国际货币基金组织IMF&#xff1a;美国通胀尚未“转危为安” 美联储需加息到底 1.1.2、美联储布拉德&a…

Servlet是什么?有哪些优点?

Servlet是使用Java语言编写的运行在服务器端的程序。狭义的Servlet是指Java语言实现的一个接口&#xff0c;广义的Servlet是指任何实现了这个Servlet接口的类&#xff0c;一般情况下&#xff0c;人们将Servlet理解为后者。Servlet主要用于处理客户端传来的HTTP请求&#xff0c;…

【数组经典题目】总结篇

【数组经典题目】总结篇1 二分法2 双指针法3 滑动窗口4 模拟行为5 总结1 二分法 【数组】leetcode704.二分查找(C/C/Java/Js) 使用暴力解法&#xff0c;通过这道题目&#xff0c;如果追求更优的算法&#xff0c;建议试一试用二分法&#xff0c;来解决这道题目 暴力解法时间复…

机器学习实战教程(十):提升分类器性能利器-AdaBoost

一、前言前面的文章已经介绍了五种不同的分类器&#xff0c;它们各有优缺点。我们可以很自然地将不同的分类器组合起来&#xff0c;而这种组合结果则被成为集成方法(ensemble method)或者元算法(meta-algorithm)。使用集成方法时会有多种形式&#xff1a;可以是不同算法的集成&…

CCF BDCI|算能赛题决赛选手说明论文-02

周伟伟 智能边缘事业部&算法工程师 天翼云科技有限公司 中国-广州 zhouweiweichinatelecom.cn黄宇生智能边缘事业部&算法工程师 天翼云科技有限公司 中国-广州 huangyushchinatelecom.cn林瑞玉智能边缘事业部&算法工程师 天翼云科技有限公司 中国-广州 lin…