首页 > 编程语言 >C++ 信号

C++ 信号

时间:2023-10-06 10:23:39浏览次数:40  
标签:缺省 C++ 终止 信号 进程 行为 define

信号

概念

  • 信号是 Linux 进程间通信的一种机制,是软件层次上对中断的一种模拟,用在进程之间的传递消息。

来源

  • 内核产生
    • 内存错误,除 0 错误等
  • 由其他进程产生,传递给目标进程
    • kill 信号
    • 自定义信号:SIGURG
  • 硬件产生
    • 键盘

处理方式

  • 发送阶段
    • 内核将信号放到对应的 pending 队列中
  • 接受阶段
    • 内核将信号从 pending 队列中取出,并进行处理。一般是调用响应的处理函数
    • 处理方式由三种,用户定义处理函数,内核默认缺省处理,忽略

处理过程

  • signal 函数用于捕获突发事件
void (*signal (int sig, void (*func)(int)))(int); 
//signal(registered signal, signal handler);
  • raise 函数用于发送信号
int raise ( int signal_ );

代码

  1. signal.cpp
#include <iostream>
#include <csignal>
#include <unistd.h>

using namespace std;

void signalHandler(int signum)
{
    cout << "Interrupt signal (" << signum << ") received.\n";
    exit(signum);
}

int main()
{
    signal(SIGINT, signalHandler);
    while(1){
        cout << "Go to slepp..." << endl;
        sleep(1);
    }

    return 0;
}
  1. raise.cpp
#include <iostream>
#include <csignal>
#include <unistd.h>

using namespace std;

void signalHandler(int signum)
{
    cout << "Interrupt signal (" << signum << ") received.\n";
    exit(signum);
}

int main()
{
    signal(SIGINT, signalHandler);

    int num = 1;
    while(num++){
        cout << "Go to slepp..." << endl;
        sleep(1);

        if( 3 == num) {
            raise(SIGINT);
        }
    }

    // signal(SIGUSR1, SIG_DFL); // default handle
    // signal(SIGUSR2, SIG_IGN); // ignore handle

    return 0;
}

信号类型

  1. #define SIGHUP 1 /* hangup*/
    • 通知进程控制终端被断开,常用来重启服务进程达到重新读取配置文件的目的
    • 缺省行为是终止进程。
  2. #define SIGINT 2
    • 中断信号
    • 缺省行为是终止进程
  3. #define SIGQUIT 3
    • 通知进程退出。
    • 缺省行为是终止进程,并且创建一个核心转储
  4. #define SIGILL 4
    • 进程在运行过程中某一句指令不能被 CPU 识别。可能是一些形式错误,未知或者是特权指令。
    • 缺省行为是终止进程,并创建一个核心转储
  5. #define SIGTRAP 5
    • POSIX 定义,用于调试。当被调试进程接收到该信号后,就意味着它达到了一个调试断点。
    • 一旦该信号被交付,被调试的进程就会停止,并且它的父进程将接到通知
    • 缺省行为是终止进程,并创建一个核心转储
  6. #define SIGABRT 6
    • 在异常终止一个进程的同时创建一个核心转储的方法
    • 如果该信号被捕获,并且信号处理句柄没有返回,则进程不会终止
    • 缺省行为是终止进程,并且创建一个核心转储
  7. #define SIGFPE 8
    • 当进程发生一个浮点错误时,SIGFPE 信号被发送给该进程
    • 对于那些处理复杂数学运算的程序,一般会建议你捕获该信号
    • 缺省行为是终止进程,并且创建一个核心转储
  8. #define SIGKILL 9
    • 结束信号
    • 该信号不能被捕获或者忽略
    • 极少数情况下不会被终止进程,比如在处理一个“非中断操作”,如磁盘 I/O,虽然该情况极少发生,但是一旦发生就会造成死锁。唯一结束进程的方法就是重启
    • 缺省行为是终止进程
  9. #define SIGBUS 10
    • CPU 检测到数据总线上的错误时将会产生 SIGBUS。
    • 当程序尝试去访问一个没有正确对齐的内存地址时就会产生该信号
    • 缺省行为是终止进程,并且创建一个核心转储
  10. #define SIGSEGV 11
    • 当程序没有权限去访问一个受保护的内存地址时,或者访问无效的虚拟内存地址时,会产生该信号
    • 缺省行为是终止进程,并创建一个核心转储
  11. #define SIGSYS 12
    • 进程执行一个不存在的系统调用时由操作系统产生,然后该进程终止
    • 缺省行为是终止进程,并创建一个核心转储
  12. #define SIGPIPE 13
    • 管道信号,允许进程之间的通信。如果进程尝试对管道执行写操作,然后管道另一方没有回应者时,操作系统会将该信号发送给该进程
    • 缺省行为是终止进程
  13. #define SIGALRM 14
    • 在进程的计时器到期的时候,操作系统会发送该信号给该进程
    • 缺省行为是终止进程
  14. #define SIGTERM 15
    • 通知进程终止,并在终止前做一些清理工作。
    • kill 命令发送的缺省信号,同时也是操作系统关闭时向进程发送的缺省信号
    • 缺省行为是终止进程
  15. #define SIGURG 16
    • 在进程打开的套接字上发生的某些情况时, SIGURG 会被发送给该进程。
    • 缺省行为是丢弃该信号
  16. #define SIGSTOP 17
    • 停止信号,进程收到该信号后会暂停运行,直到收到 SIGCONT 信号
    • 该信号不能被捕获或者忽略
    • 缺省行为是停止进程,直到收到 SIGCONT 信号
  17. #define SIGTSTP 18
    • 同 SIGSTOP 类似,但该信号可以被捕获或者忽略,键盘输入 CTRL+Z 可以产生该信号
    • 缺省行为是停止运行,直到收到 SIGCONT 信号
  18. #define SIGCONET 19
    • 恢复信号。不能忽略或阻塞,但是可以捕获。
    • 缺省行为是丢弃
  19. #define SIGCHLD 20
    • 一个进程子进程状态发生后,该信号就会发送到该进程。
    • 缺省行为是丢弃
  20. #define SIGTTIN 21
    • 当一个后台进程尝试进行一个读操作时,SIGTTIN 信号就会被发送给该进程。进程将会阻塞直到收到 SIGCONT 信号为止。
    • 缺省行为是停止进程
  21. #define SIGTTOU 22
    • 类似与 SIGTTIN,不同之处在于 SIGTTOU 是后台进程尝试对一个设置了 TOSTOP 属性的 tty 执行写操作时才会产生,如果 tty 没有设置这个属性,该信号就不会被发送
    • 缺省行为是停止进程,直到收到 SIGCONT 信号为止
  22. #define SIGIO 23
    • 如果进程在一个文件描述符上有 IO 操作的话,SIGIO 信号将被发送给该进程。进程可以通过 fcntl 调用来设置
    • 缺省行为是丢弃该信号
  23. #define SIGXCPU 24
    • 如果一旦进程超出了它可以使用的 CPU 限制,SIGXCPU 信号就被操作系统发送给该进程
    • 缺省行为是终止该进程
  24. #define SIGXFSZ 25
    • 如果一个进程超出了它可以使用的文件大小的限制,SIGXFSZ 信号就可以发送给该进程。缺省行为是终止进程
  25. #define SIGVTALRM 26
    • 一旦进程超过了它设定的虚拟计时器,SIGVTALRM 信号就会被发送给该进程,+ 缺省行为是终止进程
  26. #define SIGPROF 27
    • 当设置了计时器,SIGPROF 是另一个将会发送给进程的信号
    • 缺省行为是终止进程
  27. #define SIGWINCH
    • 当进程调正了终端的行或者列时,SIGWINCH 信号就被发送给该进程
    • 缺省行为是丢弃该信号
  28. #define SIGUSR1 29
  29. #define SIGUSR2 30
    • 用户自定义信号

标签:缺省,C++,终止,信号,进程,行为,define
From: https://www.cnblogs.com/wanghao-boke/p/17744288.html

相关文章

  • C++算法之旅、08 基础篇 | 质数、约数
    质数在>1的整数中,如果只包含1和本身这两个约数,就被称为质数(素数)866试除法判定866.试除法判定质数-AcWing题库\(O(n)\)boolisprime(intx){if(x<2)returnfalse;for(inti=2;i<x;i++)if(x%i==0)returnfalse;returntrue;......
  • 14_C++对c的扩展
    c++对c的扩展::作用域运算符::使用全局变量usingnamespacestd;inta=10;voidtest01(){inta=20;cout<<a<<endl;//20cout<<::a<<endl;//10}命名空间namespacenamespace和c语言中static只在本源文件中有效差不多命名空间使用语法创建一......
  • C++ 数据结构插入效率学习
    转自:https://blog.csdn.net/breaksoftware/article/details/829478381.总结在头部插入。元素数量>15k时,效率unordered_set>set,unordered_map>map。元素数量<1024时,效率unordered_set>set,map> unordered_map。元素数量<256时,效率unordered_set>set,map> unorder......
  • C++ namespace User_Unauthorized version 1.0.0 is officially released
    CodenamespaceUser_Unauthorized{/***@briefThisisaheaderfileforcompetitiveprogramming.*@authorUser-Unauthorized*@version1.0.0*@date2023-10-5*/typedeflonglongvalueType;typedefstd::vector<......
  • C++ Profiler Introduction [CPU Time Only]
    C++ProfilerIntroduction[CPUTimeOnly]author:LastWhisperdate:2023/10/05ThereareseveralprofilersforC++.Basedonmyresearch,I'vefoundthattracyisthemostpowerful.However,it'schallengingtoconfigure.Toquicklybenchmark......
  • C/C++学习 -- HMAC算法
    1.HMAC算法概述HMAC,全称为HMAC-MD5、HMAC-SHA1、HMAC-SHA256等,是一种在数据传输中验证完整性和认证来源的方法。它结合了哈希函数和密钥,通过在数据上应用哈希函数,生成一个带密钥的散列值,用于验证数据的完整性。HMAC算法广泛应用于网络协议、数字签名、认证和访问控制等领域。2.HM......
  • 用C++写的一个万用哈希函数模板
    用C++写的一个万用哈希函数模板template<typenameT>inlinevoidhash_combine(size_t&seed,constT&val){seed^=hash<T>()(val)+0x9e3779b9+(seed<<6)+(seed<<2);}template<typenameT,typename......
  • windows上的C++编译环境
    Windows上的C++编程环境比Linux上的繁杂很多,有许多工具已经很老了,但是很多教材也还在用,很多学校的教学也还在用。另一方面,有更现代的选择,但是需要一些必要的配置和对工具链组成的理解,本文将必要的环境都介绍一遍,让新手能有一个相对完整的理解,然后迅速抛弃老旧的工具链,使用更现代......
  • VC++编写ActiveX控件方法
    暑假在做一个项目的时候,本来是用C#.NET来写的一个港口进出闸的流程控制程序,里面涉及一个响应用PLC的采集信息的问题(PLC用串口和工控机相连接),然后思考如何用C#写串口通讯程序,结果师兄在一旁直接用VC++写了一个“*.ocx控件”,并在自己的电脑上进行了测试,完工后就把生成的“*.ocx”控......
  • C++中的inline用法
    1.引入inline关键字的原因在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数。栈空间就是指放置程序的局部数据(也就是函数内数据)的内存空间。在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足而导致程......