【LinuxC语言】信号的基本概念与基本使用

文章目录

  • 前言
  • 一、信号的概念
  • 二、信号的使用
    • 2.1 基本的信号类型
    • 2.2 signal函数
  • 总结


前言

在Linux环境下,信号是一种用于通知进程发生了某种事件的机制。这些事件可能是由操作系统、其他进程或进程本身触发的。对于C语言编程者来说,理解信号的基本概念和使用方法是非常重要的,因为它们可以用来实现进程间通信、处理异常情况以及实现一些高级功能。


一、信号的概念

信号是一种在UNIX和类UNIX操作系统中用于通知进程发生事件的机制。它们是一种异步通信方式,可以由操作系统、其他进程或者进程本身发送给目标进程。信号的本质是一种软件中断,它提供了一种简单而有效的进程间通信方式,用于处理异步事件。

每个信号都有一个唯一的数字标识符,称为信号编号。例如,常见的信号包括SIGINT(表示终端中断,通常由Ctrl+C发送)、SIGTERM(表示终止请求)和SIGSEGV(表示无效的内存访问)。操作系统提供了一套标准的信号,同时也允许用户自定义信号。

信号可以用于多种用途,包括但不限于:
处理用户输入:例如,在终端中按下Ctrl+C会发送SIGINT信号,通常用于终止正在运行的程序。
错误处理:某些异常情况,如无效的内存访问或除以零,会触发相应的信号,进而允许程序进行错误处理或者优雅地退出。
进程间通信:进程可以向其他进程发送信号,从而实现简单的进程间通信。
进程控制:通过发送不同的信号,可以控制目标进程的行为,例如启动、停止或重新加载。
总之,信号是UNIX系统中一种重要的进程间通信机制,它允许进程在某些事件发生时得到及时通知,并采取相应的措施。

想象一下你在做一件事情,突然间有人拍了拍你的肩膀,告诉你:“快停下来!”这个拍肩膀的动作就好比是信号,而你停下来的反应就是信号的作用。

在计算机世界里,信号就像是操作系统或者其他程序发出的一种消息,告诉你的程序说:“发生了某件事情!”这件事情可能是用户按下了某个键,或者出现了程序出错的情况,等等。

所以,信号的本质就是一种通知机制,用来告诉程序发生了什么事情,程序可以根据不同的信号做出相应的处理,就像你收到不同的消息,会有不同的反应一样。

二、信号的使用

2.1 基本的信号类型

以下是Linux系统中的全部信号及其相应的编号:

信号名称信号编号说明
SIGHUP1终端挂起或控制进程终止。
SIGINT2由键盘引起的中断,通常是用户按下Ctrl+C。
SIGQUIT3由键盘引起的退出,通常是用户按下Ctrl+\。
SIGILL4非法指令。
SIGTRAP5追踪或断点陷。
SIGABRT6异常终止条件,通常由abort函数发出。
SIGBUS7总线错误。
SIGFPE8浮点异常。
SIGKILL9无条件终止,无法被捕获或忽略。
SIGUSR110用户自定义信号1。
SIGSEGV11无效的内存引用。
SIGUSR212用户自定义信号2。
SIGPIPE13向无读取进程的管道写数据时触发。
SIGALRM14定时器到期。
SIGTERM15终止请求,用于优雅地终止进程。
SIGSTKFLT16协处理器栈错误。
SIGCHLD17子进程状态改变。
SIGCONT18继续执行停止的进程。
SIGSTOP19停止进程。
SIGTSTP20交互停止信号,通常由用户按下Ctrl+Z。
SIGTTIN21后台进程尝试读取标准输入。
SIGTTOU22后台进程尝试写入标准输出。
SIGURG23紧急情况的socket条件。
SIGXCPU24超出CPU时间限制。
SIGXFSZ25超出文件大小限制。
SIGVTALRM26虚拟定时器到期。
SIGPROF27进程控制定时器到期。
SIGWINCH28窗口大小调整。
SIGIO29异步IO事件。
SIGPWR30电源故障。
SIGSYS31非法系统调用。

2.2 signal函数

signal函数原型:

#include <signal.h>

void (*signal(int signum, void (*handler)(int)))(int);

作用:

signal函数用于设置对特定信号的处理方式。通过该函数,可以指定当接收到指定信号时所要执行的处理函数。

参数:

  • signum:要设置处理方式的信号编号。
  • handler:处理该信号的函数指针,可以是一个函数或者SIG_IGN(忽略该信号)或SIG_DFL(使用默认处理方式)。

返回值:

signal函数返回一个函数指针,指向之前的信号处理函数。如果发生错误,则返回SIG_ERR(-1)。

示例代码:

下面是一个示例代码,演示了如何使用signal函数来设置对SIGINT信号的处理方式:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

// 自定义信号处理函数
void sigint_handler(int signum) {
    printf("接收到SIGINT信号,即将退出...\n");
    // 这里可以执行一些清理操作
    exit(0);
}

int main() {
    // 注册SIGINT信号的处理函数
    if (signal(SIGINT, sigint_handler) == SIG_ERR) {
        perror("无法注册SIGINT信号处理函数");
        return 1;
    }

    printf("按下Ctrl+C试试看!\n");

    // 无限循环,等待信号
    while (1) {
        sleep(1);
    }

    return 0;
}

在这里插入图片描述

在这个示例中,我们使用signal函数将SIGINT信号的处理方式设置为我们自定义的函数sigint_handler。当程序接收到SIGINT信号(即用户按下Ctrl+C)时,将会调用该函数来处理信号。


总结

通过学习信号的基本概念和使用方法,我们可以更好地编写可靠的Linux应用程序。通过注册信号处理函数,我们可以定义在收到特定信号时所采取的行动,从而实现进程的自定义行为。然而,要注意信号处理函数的编写应尽量简洁高效,避免在其中执行过多的操作,以确保信号处理过程尽可能快速地完成。此外,要注意在多线程程序中使用信号时可能引发的竞态条件和其他并发问题,因此在这种情况下需要额外的注意和谨慎。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

36.Docker-Dockerfile自定义镜像

镜像结构 镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。 镜像是分层机构&#xff0c;每一层都是一个layer BaseImage层&#xff1a;包含基本的系统函数库、环境变量、文件系统 EntryPoint:入口&#xff0c;是镜像中应用启动的命令 其他&#xff1a;在…

从0开始学习制作一个微信小程序 学习部分(6)组件与事件绑定

系列文章目录 学习篇第一篇我们讲了编译器下载&#xff0c;项目、环境建立、文件说明与简单操作&#xff1a;第一篇链接 第二、三篇分析了几个重要的配置json文件&#xff0c;是用于对小程序进行的切换页面、改变图标、控制是否能被搜索到等的操作第二篇链接、第三篇链接 第四…

QT的TcpServer

Server服务器端 QT版本5.6.1 界面设计 工程文件&#xff1a; 添加 network 模块 头文件引入TcpServer类和TcpSocket&#xff1a;QTcpServer和QTcpSocket #include <QTcpServer> #include <QTcpSocket>创建server对象并实例化&#xff1a; /*h文件中*/QTcpServer…

基于SSM SpringBoot vue宾馆网上预订综合业务服务系统

基于SSM SpringBoot vue宾馆网上预订综合业务服务系统 系统功能 首页 图片轮播 宾馆信息 饮食美食 休闲娱乐 新闻资讯 论坛 留言板 登录注册 个人中心 后台管理 登录注册 个人中心 用户管理 客房登记管理 客房调整管理 休闲娱乐管理 类型信息管理 论坛管理 系统管理 新闻资讯…

Docker-Compose编排LNMP并部署WordPress

前言 随着云计算和容器化技术的快速发展&#xff0c;使用 Docker Compose 编排 LNMP 环境已经成为快速部署 Web 应用程序的一种流行方式。LNMP 环境由 Linux、Nginx、MySQL 和 PHP 组成&#xff0c;为运行 Web 应用提供了稳定的基础。本文将介绍如何通过 Docker Compose 编排 …

BUUCTF---misc---被偷走的文件

1、题目描述 2、下载附件&#xff0c;是一个流量包&#xff0c;拿去wireshark分析&#xff0c;依次点开流量&#xff0c;发现有个流量的内容显示flag.rar 3、接着在kali中分离出压缩包&#xff0c;使用下面命令&#xff0c;将压缩包&#xff0c;分离出放在out3文件夹中 4、在文…

Java -- (part21)

一.File类 1.概述 表示文件或者文件夹的路径抽象表示形式 2.静态成员 static String pathSeparator:路径分隔符:; static String separator:名称分隔符:\ 3.构造方法 File(String parent,String child) File(File parent,String child) Flie(String path) 4.方法 获…

在M1芯片安装鸿蒙闪退解决方法

在M1芯片安装鸿蒙闪退解决方法 前言下载鸿蒙系统安装完成后&#xff0c;在M1 Macos14上打开闪退解决办法接下来就是按照提示一步一步安装。 前言 重新安装macos系统后&#xff0c;再次下载鸿蒙开发软件&#xff0c;竟然发现打不开。 下载鸿蒙系统 下载地址&#xff1a;http…

Android使用kts上传aar到JitPack仓库

Android使用kts上传aar到JitPack 之前做过sdk开发&#xff0c;需要将仓库上传到maven、JitPack或JCenter,但是JCenter已停止维护&#xff0c;本文是讲解上传到JitPack的方式,使用KTS语法&#xff0c;记录使用过程中遇到的一些坑. 1.创建项目(library方式) 由于之前用鸿神的w…

每日OJ题_贪心算法二⑥_力扣409. 最长回文串

目录 力扣409. 最长回文串 解析代码 力扣409. 最长回文串 409. 最长回文串 难度 简单 给定一个包含大写字母和小写字母的字符串 s &#xff0c;返回 通过这些字母构造成的 最长的回文串 。 在构造过程中&#xff0c;请注意 区分大小写 。比如 "Aa" 不能当做一个…

【Java从入门到精通】Java继承

继承的概念 继承是java面向对象编程技术的一块基石&#xff0c;因为它允许创建分等级层次的类。 继承就是子类继承父类的特征和行为&#xff0c;使得子类对象&#xff08;实例&#xff09;具有父类的实例域和方法&#xff0c;或子类从父类继承方法&#xff0c;使得子类具有父…

Linux 麒麟系统安装

国产麒麟系统官网地址&#xff1a; https://www.openkylin.top/downloads/ 下载该镜像后&#xff0c;使用VMware部署一个虚拟机&#xff1a; 完成虚拟机创建。点击&#xff1a;“开启此虚拟机” 选择“试用试用开放麒麟而不安装&#xff08;T&#xff09;”&#xff0c;进入op…

React Native支持Tailwind CSS 语法

React Native支持Tailwind CSS 语法 一、前沿背景 回想下我们平时按照官方的规范进行书写样式是什么样&#xff1f; 是像下面这样&#xff1a; const MyComponent () > {return (<View><Text style{{ fontSize: 20 }}>开发者演示专用</Text></View…

【论文阅读】Tutorial on Diffusion Models for Imaging and Vision

1.The Basics: Variational Auto-Encoder 1.1 VAE Setting 自动编码器有一个输入变量x和一个潜在变量z Example. 获得图像的潜在表现并不是一件陌生的事情。回到jpeg压缩&#xff0c;使用离散余弦变换&#xff08;dct&#xff09;基φn对图像的底层图像/块进行编码。如果你给…

4 Spring AOP

目录 AOP 简介 传统开发模式 先来看一个需求 解决方案 AOP 图示 Spring 启用 AspectJ 基于 xml 配置 创建 pom.xml 创建 UserService 借口和 UserServiceImpl实现类 创建 LogAdvice 日志通知 创建 log4j.properties 重点&#xff1a;创建 spring-context-xml.xml 配…

【深度学习】第二门课 改善深层神经网络 Week 2 3 优化算法、超参数调试和BN及其框架

&#x1f680;Write In Front&#x1f680; &#x1f4dd;个人主页&#xff1a;令夏二十三 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;深度学习 &#x1f4ac;总结&#xff1a;希望你看完之后&#xff0c;能对…

Go语言基础语法(一):变量的声明与赋值

四种声明 变量声明 Go语言是静态类型语言&#xff0c;因此变量&#xff08;variable&#xff09;是有明确类型的&#xff0c;编译器也会检查变量类型的正确性。在数学概念中&#xff0c;变量表示没有固定值且可改变的数。但从计算机系统实现角度来看&#xff0c;变量是一段或…

Simulink|【免费】虚拟同步发电机(VSG)惯量阻尼自适应控制仿真模型

主要内容 该模型为simulink仿真模型&#xff0c;主要实现的内容如下&#xff1a; 随着风力发电、光伏发电等新能源发电渗透率增加&#xff0c;电力系统的等效惯量和等效阻尼逐渐减小&#xff0c;其稳定性问题变得越来越严峻。虚拟同步发电机&#xff08;VSG&#xff09;技…

win10部署本地大模型langchain+ollama

一、环境 windows10、Python 3.9.18、langchain0.1.9 二、ollama下载 Download Ollama on Windows 0.1.33版本链接https://objects.githubusercontent.com/github-production-release-asset-2e65be/658928958/35e38c8d-b7f6-48ed-8a9c-f053d04b01a9?X-Amz-AlgorithmAWS4-H…

ubuntu搭建node私库Verdaccio

ubuntu搭建node私库Verdaccio Verdaccio 是一个轻量级的私有 npm 代理注册服务器&#xff0c;它是开源的&#xff0c;可以帮助你设置和维护企业内部的 npm 包的存储库。使用 Verdaccio 可以让你完全控制包的发布流程、依赖关系以及访问策略。这篇文章将指导你如何在 Ubuntu 系…