首页 > 编程语言 >C++ 中的信号的处理

C++ 中的信号的处理

时间:2023-06-05 22:36:13浏览次数:48  
标签:处理 signal .... C++ Going sleep 信号 include

C++ 信号处理

信号是由操作系统传给进程的中断,会提早终止一个程序。在 UNIX、LINUX、Mac OS X 或 Windows 系统上,可以通过按 Ctrl+C 产生中断。

有些信号不能被程序捕获,但是下表所列信号可以在程序中捕获,并可以基于信号采取适当的动作。这些信号是定义在 C++ 头文件 <csignal> 中。

信号

描述

SIGABRT

程序的异常终止,如调用 abort

SIGFPE

错误的算术运算,比如除以零或导致溢出的操作。

SIGILL

检测非法指令。

SIGINT

程序终止(interrupt)信号。

SIGSEGV

非法访问内存。

SIGTERM

发送到程序的终止请求。

signal() 函数

C++ 信号处理库提供了 signal 函数,用来捕获突发事件。以下是 signal() 函数的语法:

void (*signal (int sig, void (*func)(int)))(int);

这个看起来有点费劲,以下语法格式更容易理解:

signal(registered signal, signal handler)

这个函数接收两个参数:第一个参数是一个整数,代表了信号的编号;第二个参数是一个指向信号处理函数的指针。

让我们编写一个简单的 C++ 程序,使用 signal() 函数捕获 SIGINT 信号。不管您想在程序中捕获什么信号,您都必须使用 signal 函数来注册信号,并将其与信号处理程序相关联。看看下面的实例:

实例

#include<iostream>#include<csignal>#include<unistd.h>usingnamespacestd; voidsignalHandler(intsignum){cout"Interrupt signal ("signum") received.\n"; // 清理并关闭// 终止程序 exit(signum); }intmain(){// 注册信号 SIGINT 和信号处理程序signal(SIGINT, signalHandler); while(1){cout"Going to sleep...."endl; sleep(1); }return0; }

当上面的代码被编译和执行时,它会产生下列结果:

Going to sleep....
Going to sleep....
Going to sleep....

现在,按 Ctrl+C 来中断程序,您会看到程序捕获信号,程序打印如下内容并退出:

Going to sleep....
Going to sleep....
Going to sleep....
Interrupt signal (2) received.

raise() 函数

您可以使用函数 raise() 生成信号,该函数带有一个整数信号编号作为参数,语法如下:

int raise (signal sig);

在这里,sig 是要发送的信号的编号,这些信号包括:SIGINT、SIGABRT、SIGFPE、SIGILL、SIGSEGV、SIGTERM、SIGHUP。以下是我们使用 raise() 函数内部生成信号的实例:

实例

#include<iostream>#include<csignal>#include<unistd.h>usingnamespacestd; voidsignalHandler(intsignum){cout"Interrupt signal ("signum") received.\n"; // 清理并关闭// 终止程序 exit(signum); }intmain(){inti0; // 注册信号 SIGINT 和信号处理程序signal(SIGINT, signalHandler); while(++i){cout"Going to sleep...."endl; if(i3){raise(SIGINT); }sleep(1); }return0; }

当上面的代码被编译和执行时,它会产生下列结果,并会自动退出:

Going to sleep....
Going to sleep....
Going to sleep....
Interrupt signal (2) received.

 C++ 预处理器

C++ 多线程 

 

2 篇笔记 写笔记


  1.    爱撸码的张小白
      122***[email protected]
      参考地址
    33

    Sleep 函数
    功能:执行挂起一段时间,也就是等待一段时间在继续执行
    用法:Sleep(时间)
    注意:
  •  (1)Sleep 是区分大小写的,有的编译器是大写,有的是小写。
  •  (2)Sleep 括号里的时间,在 Windows 下是以毫秒为单位,而 Linux 是以秒为单位。
#include <iostream>
#include <windows.h>

using namespace std;

int main()
{
    int a = 1;
    while (a)
    {
        cout << "欢迎来到菜鸟教程!" << endl;
        Sleep(100);
    }
    system("pause");
    return 0;
}


  1. Linux 用 #include <unistd.h> 和 sleep(),Windos 用 #include <windows.h> 和 Sleep()
#include <iostream>
#include <csignal>
#include <windows.h>

using namespace std;

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

    // 清理并关闭
    // 终止程序  

    exit(signum);

}

int main()
{
    int i = 0;
    // 注册信号 SIGINT 和信号处理程序
    signal(SIGINT, signalHandler);

    while (++i) {
        cout << "Going to sleep...." << endl;
        if (i == 3) {
            raise(SIGINT);
        }
        Sleep(1);
    }

    return 0;
}



标签:处理,signal,....,C++,Going,sleep,信号,include
From: https://blog.51cto.com/u_4018548/6420089

相关文章

  • C#调用C++dll
    C#调用C++dll的方法和步骤其他分享涉及到的概念和方法对于像我这样比较菜的选手看起来比较费劲并且很难抓住重点,这里我总结了一段时间的研究成果供初学者救济之用,简单明了。工具/原料 VS2008方法/步骤 新建项目->VisualC++->Win32项目 MyDLL注意:C++编写的dll一般是不能直接拿来......
  • C#中调用c++的dll具体创建与调用步骤,亲测有效~ (待验证)
    使用的工具是VS2010哦~其他工具暂时还没试过我新建的工程名是my21dll,所以会生成2个同名文件。接下来需要改动的只有画横线的部分下面是my21dll.h里面的。。。下面的1是自动生成的不用动,或者也可以不要,因为只是一个宏而已下面可以做相应修改。下面的2是自动生成的类,我没用就注释掉了......
  • C++面试八股文:如何在堆上和栈上分配一块内存?
    某日二师兄参加XXX科技公司的C++工程师开发岗位6面:面试官:如何在堆上申请一块内存?二师兄:常用的方法有malloc,new等。面试官:两者有什么区别?二师兄:malloc是向操作系统申请一块内存,这块内存没有经过初始化,通常需要使用memset手动初始化。而new一般伴随三个动作,向操作系统申请一......
  • win10,vs2015深度学习目标检测YOLOV5+deepsort C++多目标跟踪代码实现,源码注释,拿来即
    int8,FP16等选择,而且拿来即用,自己再win10安装上驱动可以立即使用,不用在自己配置,支持答疑。自己辛苦整理的,求大佬打赏一顿饭钱。苦苦苦、平时比较比忙,自己后期会继续发布真实场景项目;欢迎下载。优点:1、架构清晰,yolov5和sort是分开单独写的,可以随意拆解拼接,都是对外接口。2、支持答疑......
  • 4.2 理解现代处理器
    为了理解改进性能的方法,我们需要理解现代处理器的微体系结构。由于大量的晶体管可以被集成到一块芯片上,现代微处理器采用了复杂的硬件,试图使程序性能最大化。带来的一个后果就是处理器的实际操作与通过观察机器级程序所察觉到的大相径庭。在代码级上,看上去似乎是一次执行一条指令,......
  • p5 节点流和处理流
    节点流和处理流目录节点流和处理流一、基本介绍二、节点流和处理流的区别和联系三、处理流的功能主要体现在以下两个方面:四、处理流—BufferedReader和BufferedWriter节点流和处理流一览图:​ 【图片来源】http://t.csdn.cn/d52a1一、基本介绍节点流:节点流可以......
  • kaggle notebook 处理临时脚本的方法
    #=写入项目临时代码aaa='''#!/usr/bin/envpython#coding=utf-8#Copyright2023TheHuggingFaceInc.team.Allrightsreserved.##LicensedundertheApacheLicense,Version2.0(the"License");#youmaynotusethisfileexceptincom......
  • c++
    因此,想要查看一个数组变量的地址,代码为:intarr[10];cout<<arr<<endl;//注意,arr之前无需&。查看数组中第一个元素的地址:intarr[10];cout<<&arr[0]<<endl;递归:递归的过程是压栈的过程,递归结束,会出栈进行计算二维数组:二维数组的存储是按照行进行扫描,每行的元素依......
  • C++设计模式:观察者模式
    观察者模式又叫做发布-订阅模式;观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动的更新自己。有两大类(主题和观察者)一共四个角色从上面我们可以看到,这里面包含了:(1)抽象主题/抽象......
  • 用分治处理决策单调性问题
    决策单调性是dp转移方程的一种性质。一般而言,我们有许多方法优化一个具有决策单调性的转移方程。这里主要讲解一种用分治解决决策单调性问题的方法。引入先看一道题:CF868F我们可以想到一个\(O(n^2k)\)暴力。定义\(dp_{i,j}\)为令点\(i\)为第\(j\)段的最后一个点产......