C++ Webserver从零开始:基础知识(五)——信号

这篇具有很好参考价值的文章主要介绍了C++ Webserver从零开始:基础知识(五)——信号。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Linux信号概述

Linux系统中,信号是一种通信的方式,其通常用作用户,系统或进程给目标进程发送的信息。

信号的作用:通知目标进程某个状态的改变或系统异常。

产生的条件:

  1. 对于终端程序:可以是用户输入的特殊的终端字符,比如ctrl+c是中断信号
  2. 系统异常,如浮点异常或非法内存访问
  3. 系统状态变化
  4. 用户运行kill命令或程序调用kill函数

程序必须处理(忽略可以算作处理的一种)一些常见信号

发送信号

进程给其他进程发送信号使用kill函数

#include<sys/types.h>
#include<signal.h>
int kill(pid_t pid,int sig);
  • 作用:发送信号
  • 参数
    • pid:目标进程的id
    • sig:发送的信号
  • 返回值:
    • 成功:0
    • 失败:-1

信号处理方式

目标进程接收到信号后,需要一个接收函数来处理信号

#include<signal.h>
typedef void (*_sighandler_t)(int);

其中 sighandler_t为一个函数指针,可以用一个函数名给其赋值,int为这个函数的参数,void表示这个函数返回值为NULL。

这是用户自定义函数,信号还有忽略和默认这两种处理方式,其定义为

#include<bits/signum.h>
#define SIG_DFL((_sighandler_t)0)
#define SIG_ING((_sighandler_t)1)

SIG_DFL为默认处理方式,SIG_ING为忽略信号

中断系统调用

程序在执行处于阻塞状态的系统调用时接收到信号,且该信号被我们设置了处理函数,那么系统调用会被中断。

如果接收到的信号的是暂停进程的信号(如SIGSTOP),即使我们没为其设置处理函数,它也可以中断一些系统调用(如connect,epoll_wait)


信号函数

当我们接收到信号,就可以为信号设置一个处理函数,Linux中有两种信号处理函数,分别是signal和sigaction

#include<signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
  • 作用:为信号设置处理函数
  • 参数
    • signum:信号的编号
    • handler:函数指针,表示接收此信号要执行的函数的地址
      • SIG_IGN:忽略这个信号
      • SIG_DFL:按照默认动作执行这个信号
      • 如果是一个函数,则受到信号时去执行这个函数
  • 返回值
    • 成功:函数指针,类型是sighandler_t
    • 失败:SIG_ERR
#include<signal.h>
int sigaction(int sig, const struct sigaction *act, struct sigaciton *oact);
  • 作用:为信号设置处理函数,或者获取信号的处理函数,或二者皆有可用来检查和更改信号处理操作,可以支持可靠、实时信号的处理,并且支持信号传递信息
  • 参数:
    • sig:信号的编号
    • act:信号动作结构体,见下
struct sigaction
{
    void (*sa_handler)(int signum); /*简单的信号处理函数指针*/
    void (*sa_sigaction)(int signum, siginfo_t *info, void *context); /*复杂的信号处理函数指针*/
    sigset_t sa_mask;               /*信号阻塞集*/
    int sa_flags;                   /*信号处理方式*/
};

网络编程相关信号

SIGHUP:

当挂起进程的控制终端时,SIGHUP信号将被触发。对于没有控制终端的网络后台程序,SIGHUB信号可以用来强制服务器重读配置程序。

SIGPIPE:

在默认情况下,往一个读端关闭的管道(或socket连接)中写数据将引发SIGPIPE信号。SIGPIPE信号的默认处理方式是结束进程。

所以为了避免因为往读端关闭的管道写数据导致进程结束,我们可以用send函数的MSG_NOSIGNAL标志来禁用写操作触发SIGPIPE信号文章来源地址https://www.toymoban.com/news/detail-819127.html

到了这里,关于C++ Webserver从零开始:基础知识(五)——信号的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 从零开始自制实现C++ High-Performance WebServer 全流程记录

    这个 从零自制高性能多线程的WebServer 博客系列呢 刚开始我写之初 其实也就是想记录一下 一个linux后端开发者 以此作为 网络编程的起点 以及多线程编程的起点的博客记录而已 因为刚开始 对于很多后台开发的前辈啊 所给出的后端学习的路啊 就比如写一个WebServer 其实这个项

    2024年02月16日
    浏览(51)
  • 现代C++中的从头开始深度学习【1/8】:基础知识

            提及机器学习框架与研究和工业的相关性。现在很少有项目不使用Google TensorFlow或Meta PyTorch,在于它们的可扩展性和灵活性。 也就是说,花时间从头开始编码机器学习算法似乎违反直觉,即没有任何基本框架。然而,事实并非如此。自己对算法进行编码可以清晰而

    2024年02月13日
    浏览(44)
  • 信号完整性相关基础知识

    一、GHz传输链路信号损耗的特征,高频和低频分量信号损耗问题 • 1. 信号沿 FR4 传播,两种有功损耗 : 导体损耗和介质损耗两种损耗的高频衰减大于低频衰减。当信号传播 4in 长时, 8GHz 以上高频分量的功率衰减量大于 50 %,而对低频分量的影响却小得多。 • 2.FR4 板上 4i

    2024年02月08日
    浏览(40)
  • 系统级基础信号知识【Linux】

    目录 一,什么是信号  进程面对信号常见的三种反应概述 二,产生信号 1.终端按键产生信号 signal 2. 进程异常产生信号 核心转储 3. 系统调用函数发送信号 kill raise abort 小结: 4. 由软件条件产生 alarm 5. 硬件异常产生信号 三,信号其他概念 1. 进程中储存信号的内核结构 2. s

    2024年02月04日
    浏览(46)
  • 【001 基础知识】自旋锁、信号量

    Linux 内核使用结构体 spinlock_t 表示自旋锁。 1. 定义: 自旋锁 最多只能被一个内核任务持有, 如果一个内核任务试图请求一个 已经被持有的自旋锁 ,那么这个任务就会一直进行 忙循环——旋转——等待锁重新可用。 2. 作用: 自旋锁可以在任何时刻 防止多于一个的内核任务

    2024年02月09日
    浏览(54)
  • 从1开始学习FPGA——FPGA的一些基础知识(1)

            这应该是笔者的第一篇CSDN博客了,之所以起名叫从1开始学习FPGA,原因在于笔者已经有一定的FPGA基础,并且使用FPGA完成了一些项目。但是基本没有系统成理论的学习FPGA,经常是用到哪看到哪,导致很多之前用过的东西往往经过一段时间就忘了。开始写CSDN博客更多的

    2024年04月10日
    浏览(48)
  • 高级-UI-从零到整-(一)-View-的基础知识你必须知道

    getX / getY : 返回相对于当前 View 左上角的 x 和 y 的坐标 getRawX / getRawY : 返回的是相对于手机屏幕左上角的 x 和 y 坐标。 TouchSlop TouchSlop 官方解释就是系统所能识别的被认为是滑动的最小距离,通俗点说就是当手指在屏幕上滑动时,如果两次滑动之间的距离小于这个常量,那么

    2024年04月26日
    浏览(46)
  • 语音信号处理基础知识之频谱、相位谱、幅度谱、功率谱及语谱图

    一段音频信号在时域上,可以用一个实数向量来表示。这个数组的大小=采样率*音频时长。举个例子:一段采样率为8000,长15.6s的音频在matlab中表示为: 15.6x8000=124800大小的实数向量 下面是利用matlab读取.wav文件和.pcm文件的两种方法 从上图可以看出,音频信号在matlab中就是用一

    2024年02月05日
    浏览(100)
  • [C++]C++基础知识概述

      目录 C++基础知识概述::                                    1.什么是C++                                    2.C++发展史                                         3.C++                                    4.命名空间                              

    2023年04月16日
    浏览(52)
  • 【如何从零基础小白开始学习C++详细介绍】

    如果你想从零基础开始学习C++并最终成为一个“大佬”级别的专家,你需要遵循一个阶段性的学习计划,并且不断练习和深入研究,下面是学习方向的学习阶段 学习编程基础 了解编程的基本概念,如变量、数据类型、运算符、控制结构(循环、条件判断)、函数等。 安装开

    2024年02月20日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包