信号的概念:
信号是UNIX系统响应某些状况而产生的事件,通常是因为某些错误条件而产生的,比如内存段冲突、浮点处理器错误或者非法指令等。
信号模拟的是硬件中断方式,它的传递信息量很少,可以用来做进程间的通知或者错误的警告等。
信号就是进程间通信的一种方式,它采用异步的工作方式。
信号类型:
在终端中输入以下语句
kill -l
查看返回结果
以上图片就是信号,所以kill并非像我们平时理解的那样“杀死”,实际应该将其理解为“发送”。类似于我们的kill -9 xxx(某个进程)的意思就是发送第九个信号(停止进程)给某个进程,进程收到这个信号就停止
信号名称:
我们注意以下两个信号,这两个信号就是预留给程序员使用的信号,但这两个/1~31叫做为不可靠信号:连续发送不会连续执行
相较于高版本来说,两个对于我们用户来说肯定是远远不够的,于是就有了34~64都是预留给程序员使用,这些为可靠信号:连续发送必须连续执行
信号的产生:
硬件方式:Ctrl+C 、出错……
软件方式:发送信号的系统调用,例如kill命令
信号的安装:
安装:设置信号的关联
使用代码发送信号:
不带参发送信号:
signal函数:signal库函数-优快云博客
系统调用函数kill(发送信号)
kill函数:kill发送信号-优快云博客
signal——kill示例:
#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
using namespace std;
void signal_function(int v)
{
cout << "触发了SIGINT信号" << endl;
}
int main()
{
pid_t pid = 0;
pid = fork();
if (pid < 0)
{
perror("fork error");
return 0;
}
else if (pid == 0) // 子进程signal安装信号
{
signal(SIGUSR1, signal_function); // 安装信号(SIGUSR1—>signal_function)
// 子进程结束无法处理信号,不让进程结束
while (1)
{
}
}
else // 主进程kill发送信号
{
// 模拟运行逻辑
for (int i = 0; i < 3; i++)
{
cout << "主进程running……" << endl;
sleep(1);
}
// 发送信号给子进程
kill(pid, SIGUSR1);
while (1)
{
}
}
return 0;
}
结果:
带参发送信号:
sigaction函数:sigaction库函数_sigaction函数怎么用-优快云博客
sigqueue函数:sigqueue库函数_sigqueue函数-优快云博客
sigaction——sigqueue示例:
#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
using namespace std;
// 信号处理函数
void sigaction_function(int signum, siginfo_t* info, void* v)
{
cout << "signum:" << signum << endl;
// 携带的数据
cout << "value:" << info->si_value.sival_int << endl;
}
int main()
{
pid_t pid = 0;
pid = fork();
if (pid < 0)
{
perror("fork error");
return 0;
}
else if (pid == 0) // 发送信号
{
sleep(1);
union sigval val;
val.sival_int = 1000; // 要携带的数据(必须是整型)
sigqueue(getppid(), SIGRTMIN, val);
}
else // 接收信号
{
struct sigaction act; // 信号处理器参数配置结构体
act.sa_flags = SA_SIGINFO; // 配置信号处理器类型可携带参数类型
act.sa_sigaction = sigaction_function; // 配置信号处理函数
// 信号安装
sigaction(SIGRTMIN, &act, NULL);
while (1)
{
}
}
return 0;
}