主页
  • 主页
  • 分类
  • 热文
  • 教程
  • 面试
  • 标签
C++

C++ 基础

C++ 主页
C++ 概述
C++ 环境
C++ 基本语法
C++ 注释
C++ 数据类型
C++ Hello, World
C++ 省略命名空间
C++ 数值类型
C++ 字符类型
C++ 布尔类型
C++ 变量
C++ 作用域
C++ 多个变量
C++ 输入输出基础
C++ 常量/文字
C++ 修饰符类型
C++ 存储类别
C++ 操作符
C++ 决策结构
C++ 循环结构
C++ foreach 循环
C++ 数字
C++ 数组
C++ 指针
C++ 枚举类型
C++ 引用变量
C++ 日期与时间
C++ 结构体
C++ 联合类型

C++ 字符串

C++ 字符串
C++ 字符串长度
C++ 字符串连接

C++ 函数

C++ 函数
C++ 多参数函数
C++ 递归
C++ return 语句
C++ 函数重载
C++ 函数重写

C++ 面向对象

C++ 面向对象
C++ 类和对象
C++ 多重继承
C++ 多层次继承
C++ 继承
C++ 重载
C++ 多态性
C++ 抽象
C++ 封装
C++ 接口

C++ 高级

C++ 文件和流
C++ 异常处理
C++ 动态内存
C++ 命名空间
C++ 模板
C++ 预处理器
C++ 信号量
C++ 多线程
C++ Web 编程
C++ 高级概念

基础

C++ 主页
C++ 概述
C++ 环境
C++ 基本语法
C++ 注释
C++ 数据类型
C++ Hello, World
C++ 省略命名空间
C++ 数值类型
C++ 字符类型
C++ 布尔类型
C++ 变量
C++ 作用域
C++ 多个变量
C++ 输入输出基础
C++ 常量/文字
C++ 修饰符类型
C++ 存储类别
C++ 操作符
C++ 决策结构
C++ 循环结构
C++ foreach 循环
C++ 数字
C++ 数组
C++ 指针
C++ 枚举类型
C++ 引用变量
C++ 日期与时间
C++ 结构体
C++ 联合类型

字符串

C++ 字符串
C++ 字符串长度
C++ 字符串连接

函数

C++ 函数
C++ 多参数函数
C++ 递归
C++ return 语句
C++ 函数重载
C++ 函数重写

面向对象

C++ 面向对象
C++ 类和对象
C++ 多重继承
C++ 多层次继承
C++ 继承
C++ 重载
C++ 多态性
C++ 抽象
C++ 封装
C++ 接口

高级

C++ 文件和流
C++ 异常处理
C++ 动态内存
C++ 命名空间
C++ 模板
C++ 预处理器
C++ 信号量
C++ 多线程
C++ Web 编程
C++ 高级概念

C++ 信号量


上一章 下一章

信号量是由操作系统发送给进程的中断信号,它可以提前终止程序。你可以在 UNIX、LINUX、Mac OS X 或 Windows 系统上通过按下 Ctrl+C 来生成中断。

有一些信号不能被程序捕获,但以下列表中列出了你可以捕获并在程序中根据信号采取适当行动的信号。这些信号定义在 C++ 标头文件 <csignal> 中。

序号 信号 描述
1 SIGABRT 程序异常终止,例如调用了 abort。
2 SIGFPE 发生错误的算术运算,例如除以零或导致溢出的操作。
3 SIGILL 发现非法指令。
4 SIGINT 收到交互式注意信号。
5 SIGSEGV 存储访问无效。
6 SIGTERM 发送给程序的终止请求。

signal() 函数

C++ 信号处理库提供了 signal 函数来捕获意外事件。signal() 函数的语法如下:

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

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

让我们写一个简单的 C++ 程序,其中我们将使用 signal() 函数来捕获 SIGINT 信号。无论你在程序中想要捕获哪个信号,你都必须使用 signal 函数注册该信号,并将其与一个信号处理程序关联起来。请参阅以下示例:

#include <iostream>
#include <csignal>

using namespace std;

void signalHandler( int signum ) {
   cout << "接收到中断信号 (" << signum << ").\n";

   // 在这里清理和关闭相关资源
   // 终止程序

   exit(signum);  
}

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

   while(1) {
      cout << "正在休眠...\n";
      sleep(1);
   }

   return 0;
}

当上述代码被编译和执行时,会产生如下结果:

正在休眠...
正在休眠...
正在休眠...

现在,按下 Ctrl+c 来中断程序,你会看到你的程序捕获了信号,并打印出类似的信息后退出:

正在休眠...
正在休眠...
正在休眠...
接收到中断信号 (2).

raise() 函数

你可以通过 raise() 函数生成信号,该函数接受一个整数信号编号作为参数,具有以下语法:

int raise (signal sig);

在这里,sig 是发送的信号编号,可以是 SIGINT、SIGABRT、SIGFPE、SIGILL、SIGSEGV、SIGTERM、SIGHUP 中的任何一个。以下是一个例子,我们在内部使用 raise() 函数来生成信号:

#include <iostream>
#include <csignal>

using namespace std;

void signalHandler( int signum ) {
   cout << "接收到中断信号 (" << signum << ").\n";

   // 在这里清理和关闭相关资源
   // 终止程序

   exit(signum);  
}

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

   while(++i) {
      cout << "正在休眠...\n";
      if( i == 3 ) {
         raise( SIGINT);
      }
      sleep(1);
   }

   return 0;
}

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

正在休眠...
正在休眠...
正在休眠...
接收到中断信号 (2).
上一章 下一章
阅读号二维码

关注阅读号

联系二维码

联系我们

© 2024 Yoagoa. All rights reserved.

粤ICP备18007391号

站点地图