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

[Linux]信号入门

一、生活中的信号

生活中会产生很多信号

  • 等待红绿灯的信号
  • 网购后等待取件的信号
  • 平台上订购外卖后到达通知的信号

往往我们人接收信号后会有三类不同的动作,比如:

  • 默认执行(红灯停绿灯行、马上取快递、马上拿外卖)
  • 进行自定义动作(边唱歌边等红绿灯、边打电话边取件)
  • 选择忽略(忽略红绿灯直接闯、忽略外卖继续打游戏

然而,在信号产生之前,我们是不清楚信号会什么时候产生?,则称为:我们和信号之间是异步的。


二、进程中的信号

1.基础理解

我们先执行一段程序:

#include<iostream>
#include<unistd.h>using namespace std;int main()
{while (true){cout << "hello, i am a process !!!" << endl;sleep(1);}return 0;
}

执行结果:
在这里插入图片描述
从结果我们可以看到,我们输入 “CTRL+C” 后,程序被终止了。原因就是按下 “CTRL+C” 会对程序发出 2号信号 —> 2) SIGINT

2.Linux中的31个普通信号

使用 kill -l 进行查阅

在这里插入图片描述
我们一般只研究前31个。前31个被称为普通信号,其他被称为实时信号

详细内容可查看如下文章:
Linux中31个普通信号含义解读


三、几个传输信号的函数接口

1.系统调用kill函数&&模拟实现

KILL(2)
NAMEkill - send signal to a processSYNOPSIS#include <sys/types.h>#include <signal.h>int kill(pid_t pid, int sig);//pid:目标进程的pid。sig:几号信号成功时(至少发送了一个信号),返回零。出现错误时,返回 -1,并设置errno

kill函数可以向任意进程发送任意信号,
kill命令底层实际上就是kill系统调用,信号的发送由用户发起,而执行者是OS。

发送信号的能力是OS的,但是有这个能力并不一定有使用这个能力的权力,一般情况下用户决定OS向目标进程发信号。所以OS有这个能力,那么对外提供能力只能通过系统调用的接口的方式来让用户向目标进程发送信号。

kill函数模拟实现如下

#include<iostream>
#include<unistd.h>
#include<sys/types.h>
#include<signal.h>
#include<string>
using namespace std;void Usage(string proc)
{cout << "Usage:\n\t" << proc << " signum pid\n\n";
}
int main(int argc, char *argv[])
{//usage: ./mykill signum pidif (argc != 3){Usage(argv[0]);exit(1);}int signum = stoi(argv[1]);pid_t pid = stoi(argv[2]);int ret = kill(pid, signum);if (ret == -1){perror("kill");exit(2);}return 0;
}
//myproc.cc
#include<iostream>
#include<unistd.h>
using namespace std;int main()
{while (true){cout << "hello, i am a process, pid is " << getpid() << endl;sleep(1);}return 0;
}

实现效果
在这里插入图片描述

2.raise函数

raise函数可以让进程给自己发送任意信号。

RAISE(3)
NAMEraise - send a signal to the callerSYNOPSIS#include <signal.h>int raise(int sig);RETURN VALUEraise() returns 0 on success, and nonzero for failure.
#include<iostream>
#include<unistd.h>
#include<sys/types.h>
#include<signal.h>
using namespace std;int main()
{int cnt = 10;while (cnt--){cout << "i am a process!!!" << endl;sleep(1);if (cnt == 5){raise(3);//kill(getpid(), 3);}}return 0;
}

实现效果
在这里插入图片描述

3.abort函数

abort终止进程的方式,给自己发送指定的信号 6) SIGABRT 。

ABORT(3)
NAMEabort - cause abnormal process terminationSYNOPSIS#include <stdlib.h>void abort(void);RETURN VALUEThe abort() function never returns.
#include<iostream>
#include<unistd.h>
#include<sys/types.h>
#include<signal.h>
#include<cstdlib>
#include<string>
using namespace std;int main()
{int cnt = 10;while (cnt--){cout << "i am a process!!!" << endl;sleep(1);if (cnt == 5){abort();//kill(getpid(), 6);}}return 0;
}

在这里插入图片描述

相关文章:

  • 【企业管理】利益分配
  • 《高等数学》(同济大学·第7版)第十章 重积分第三节三重积分
  • 科大讯飞2025AI开发者大赛-用户新增赛道时间规则解析
  • ARFoundation系列讲解 - 100 VisionPro 环境搭建
  • Swift Moya自定义插件打印日志
  • 磁悬浮轴承气隙设计深度解析:微米间的生死时速
  • 蚂蚁百宝箱体验:如何快速创建“旅游小助手”AI智能体
  • Eplan2022导入edz文件并插入使用
  • Java 使用 Easy Excel 进行 Excel 数据导入导出
  • Linux基本指令篇 —— less指令
  • GeoTools 结合 OpenLayers 实现属性查询
  • 阶段二开始-第一章—8天Python从入门到精通【itheima】-118节(继承)
  • 《红黑树实现》
  • 基于esp32s3的自定义唤醒词识别-单元测试
  • 基于CNN卷积神经网络图像识别小程序9部合集
  • 【算法深练】单调栈:有序入栈,及时删除垃圾数据
  • 2.搭建Pytorch神经网络进行气温预测
  • 数据湖 vs 数据仓库:数据界的“自来水厂”与“瓶装水厂”?
  • 表达式求值
  • Launcher3中的CellLayout 和ShortcutAndWidgetContainer 的联系和各自职责