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信号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/640726.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python中的函数(二)

1 闭包与装饰器 1.1 闭包 闭包&#xff08;Closure&#xff09;是指在一个函数内部定义的函数&#xff0c;并且该内部函数可以访问外部函数作用域中的变量。闭包可以在外部函数执行完毕后&#xff0c;仍然保持对外部函数作用域的引用&#xff0c;从而可以继续访问和操作外部函…

【Java】--网络编程:基于TCP协议的网络通信

【Java】–网络编程&#xff1a;基于TCP协议的网络通信 文章目录 【Java】--网络编程&#xff1a;基于TCP协议的网络通信一、TCP协议1.1 概念1.2 三次握手1.2.1 文字描述1.2.2 画图演示 1.3 四次挥手1.3.1 文字描述1.3.2 画图演示 二、基于TCP的Socket网络编程2.1 概念2.2 服务…

Kafka-服务端-网络层

Reactor模式 Kafka网络层采用的是Reactor模式&#xff0c;是一种基于事件驱动的模式。熟悉Java编程应该了解JavaNIO提供了实现Reactor模式的API。常见的单线程Java NIO的编程模式如图所示。 为了满足高并发的需求&#xff0c;也为了充分利用服务器的资源&#xff0c;服务端需要…

Selenium 自动化截取网页指定区域截图

一. 需求 在本篇博客中&#xff0c;我将分享一段使用Python编写的自动化网页截图代码&#xff0c;该代码基于Selenium和PIL库&#xff0c;可用于截取网页中指定区域的截图。这样的功能对于需要定期监控特定网页内容或进行网页数据采集的任务非常有用。 二. 代码解析 首先&am…

中间件存储设计 - 数组与链表

文章目录 数组ArrayListLinkedListHashMap小结 中间件主要包括如下三方面的基础&#xff1a;数据结构、JUC 和 Netty&#xff0c;接下来&#xff0c;我们先讲数据结构。 数据结构主要解决的是数据的存储方式问题&#xff0c;是程序设计的基座。 按照重要性和复杂程度&#xf…

Python fork方法:创建新进程

除可以进行多线程编程之外&#xff0c;Python 还支持使用多进程来实现并发编程。 Python 的 os 模块提供了一个 fork() 方法&#xff0c;该方法可以 fork 出来一个子进程。简单来说&#xff0c;fork() 方法的作用在于&#xff0c;程序会启动两个进程&#xff08;一个是父进程&…

《WebKit 技术内幕》学习之十(1): 插件与JavaScript扩展

虽然目前的浏览器的功能很强 &#xff0c;但仍然有其局限性。早期的浏览器能力十分有限&#xff0c;Web前端开发者希望能够通过一定的机制来扩展浏览器的能力。早期的方法就是插件机制&#xff0c;现在流行次啊用混合编程&#xff08;Hybird Programming&#xff09;模式。插件…

大模型实战营 Day5作业

基础作业&#xff1a; 使用 LMDeploy 以本地对话、网页Gradio、API服务中的一种方式部署 InternLM-Chat-7B 模型&#xff0c;生成 300 字的小故事&#xff08;需截图&#xff09; TurboMind 推理命令行本地对话 lmdeploy chat turbomind /share/temp/model_repos/internlm-cha…

RK3568平台 TinyAlsa集成第三方音频算法

一.tinyalsa介绍 ALSA&#xff08;Advanced Linux Sound Architecture&#xff09;是一个开源项目&#xff0c;涵盖了用户空间和内核空间对音频设备的操作接口&#xff0c;通过应用层使用alsalib可以实现对音频设备的控制 TinyAlsa是android推出的一个精简的ALSA库&#xff0c…

c++中STL的vector简单实现

文章目录 vector构造函数 vector()拷贝构造 vector()析构函数 ~vector()iterator 的定义begin()与const版本end()与const版本增删改查尾插push_back()尾删pop_back()指定位置插入insert()指定位置删除 erase() operator[]与const版本容量增容reserve()设置容量 resize() 成员函…

npm源更换、卡住解决方式

sill idealTree buildDeps解决方案 1. 删除用户C:\Users\{账户}\下的.npmrc文件 2. npm cache verify 3. npm config set registry https://registry.npmmirror.com更换镜像源 //任选其一 npm config set registry https://registry.npmmirror.com npm config set registry h…

Python 基于pytorch从头写GPT模型;实现gpt实战

1.定义缩放点积注意力类 import numpy as np # 导入 numpy 库 import torch # 导入 torch 库 import torch.nn as nn # 导入 torch.nn 库 d_k 64 # K(Q) 维度 d_v 64 # V 维度 # 定义缩放点积注意力类 class ScaledDotProductAttention(nn.Module):def __init__(self):super…

spring boot kafka 发送消息 完整的例子工程

以下是一个简单的Spring Boot Kafka发送消息的完整例子&#xff1a; 首先&#xff0c;添加Spring Boot Kafka的依赖到你的pom.xml文件&#xff1a; xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId…

【教程】npm的时候ssh报错ssh://git@github.com/frozeman/bignumber.js-nolookahead.git

问题&#xff1a; fiscoubuntu:~/fisco/benchmarks$ npm install install web30.20.7 npm ERR! code 128 npm ERR! An unknown git error occurred npm ERR! command git --no-replace-objects ls-remote ssh://gitgithub.com/frozeman/bignumber.js-nolookahead.git npm ERR! …

DAY27:回溯(组合问题39、40、分割回文串131)

Leetcode: 39 组合总和 基本思路 本题没有组合数字的要求&#xff0c;只有对组合总和的要求&#xff0c;因此返回条件有两个&#xff0c;等于sum的时候收集结果&#xff0c;如果大于sum了就直接跳过。 组合没有数量要求元素可以重复拾取 这题的难点在于可以反复取值。因此对…

纯c实现栈和队列 数据结构大全

栈 栈是一种后进先出的数据结构&#xff0c;可以用数组来模拟实现&#xff0c;掌握必要的数据结构是非常的有必要的 一样是先打出头文件 #pragma once#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> #include &…

Spring Cloud 系列:Seata 中TCC模式具体实现

概述 https://seata.io/zh-cn/docs/dev/mode/tcc-mode https://seata.io/zh-cn/docs/user/mode/tcc TCC模式与AT模式非常相似&#xff0c;每阶段都是独立事务&#xff0c;不同的是TCC通过人工编码来实现数据恢复。需要实现三个方法&#xff1a; Try&#xff1a;资源的检测和…

第4章-IP基本原理

目录 1. IP协议概述 1.1. 定义 1.2. 功能 1.3. IP网络的结构 1.4. IP头格式 2. IP地址和地址映射 3. IP包转发 4. 其他相关协议介绍 1. IP协议概述 1.1. 定义 IP协议&#xff1a;IP协议是网际互连协议&#xff1b; 工作层次&#xff1a;网络层&#xff1b; 封装&#…

dubbo:服务暴露

节点角色说明&#xff1a; Provider:暴露服务的服务提供方。 Consumer::调用远程服务的服务消费方。 Registry:服务注册与发现的注册中心。 Monitor:统计服务的调用次调和调用时间的监控中心。 Container:服务运行容器。 调用关系说明&#xff1a; 0.服务容器负责启动&#xff…

js之执行上下文和作用域

定义 变量和函数的上下文决定了它们可以访问那些数据&#xff0c;以及它们的行为 每个上下文都有一个关联的变量对象&#xff0c;而这个上下文中定义的所有变量和函数都在存在于这个变量对象之上 上下文再其所以代码都执行完毕之后会被销毁&#xff0c;包括定义在它上面的所有…