当前位置: 首页 > ops >正文

进程信号之signal系统调用

目录

函数原型

作用

参数讲解

返回值

示例代码


函数原型

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

作用

        系统中的信号都有其默认的处理方式,例如通过ctrl+c发送给进程的信号SIGINT默认行为是终止进程。signal系统调用用于改变信号的处理方式,使大家可以自定义信号的处理方式。后续会为大家举例说明。

参数讲解

  • signum:指定要设置处理方式的信号编号。常见的信号有:
    • SIGINT:中断信号,通常由用户在终端按下 Ctrl + C 产生,用于请求进程中断当前操作。
    • SIGTERM:终止信号,用于请求进程正常终止,进程可以捕获并处理这个信号以进行清理工作。
    • SIGKILL:杀死信号,用于强制终止进程。该信号不能被捕获、阻塞或忽略。
    • SIGSEGV:段错误信号,当进程试图访问无效内存地址(如空指针、越界指针等)时会收到此信号。
  • handler:一个函数指针,指向处理信号的函数。这个函数只有一个 int 类型的参数,该参数表示接收到的信号编号。

返回值

   signal 函数返回之前为 signum 信号设置的处理函数指针。如果调用失败,返回 SIG_ERR 并设置 errno 以指示错误原因。常见的错误包括无效的信号编号等。

示例代码

#include <stdio.h>
#include <signal.h>
#include <unistd.h>// 自定义信号处理函数
void my_handler(int signum) {printf("Received signal %d\n", signum);// 这里可以添加更多的处理逻辑,如清理资源
}int main() {// 设置SIGINT信号的处理函数if (signal(SIGINT, my_handler) == SIG_ERR) {perror("signal");return 1;}printf("Press Ctrl + C to send SIGINT...\n");while (1) {sleep(1);}return 0;
}

  • 程序开始执行,打印"Press Ctrl + C to send SIGINT...\n"
  • 进入无限循环
  • 按下Ctrl + C向进程发送SIGINT信号
  • signal捕捉SIGINT信号
  • 进入为SIGINT信号自定义的信号处理逻辑,打印"Received signal 2"

        注意由于SIGINT信号已经被捕捉,顾ctrl + c已经无法终止该进程。想要终止该进程应当先ps -aux查看进程pid,然后kill -9 pid杀死该进程。或者直接关闭xshell,关闭xshell后,会给此次会话的全部进程(除了守护进程都发送一个终止信号),然后进程退出,最后重新连接即可。
        想要了解关于会话的基础理论,可以看通俗易懂linux环境变量-CSDN博客中的第一部分“会话大致是什么?"即可。

http://www.xdnf.cn/news/13303.html

相关文章:

  • 【编译工具】(自动化)自动化测试工具:如何让我的开发效率提升300%并保证代码质量?
  • UniApp APP打包方法(Android/iOS双平台)
  • SQL进阶之旅 Day 26:分库分表环境中的SQL策略
  • 三数之和-力扣
  • BUUCTF两道目录包含题目
  • 电动阀门领域的后起之秀:舵机,速度与精度并重
  • AI【应用 01】Trae Agent Gitee自动化辅助神器(使用 MCP tools 创建自定义 Trae Agent 的探索分享)
  • 自定义鼠标效果 - 浏览器扩展使用教程
  • Linux驱动:framebuffer应用层实践
  • React Native UI 框架与动画系统:打造专业移动应用界面
  • vue中的v-model指令和组件通信机制
  • MyBatis实战指南(七)MyBatis缓存机制
  • PosterSQL日常维护
  • Asp.Net Core SignalR导入数据
  • whttpserver:一个命令极速搭建文件上传与下载服务器
  • 前端开发中vue的脚手架你知道是什么意思吗?
  • Kafka 2.7.0 单节点安装与启动教程(适配 JDK 1.8)
  • C++ 中的函数重载
  • 【S905X3通刷】【HK1 BOX】【适配slimBOXtv所有机型】slimBOXtv-9.17.2-ATV系统中文版线刷固件包
  • 循环冗余码校验CRC码 算法步骤+详细实例计算
  • ​​扩散模型调度器(Scheduler)
  • Linux系统编程-DAY12
  • 【第二十一章 SDIO接口(SDIO)】
  • Springboot度假村住宿服务平台95i1e(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • BUUCTF杂项MISC题解题思路(2)(不断更新)
  • Day50打卡 @浙大疏锦行
  • CppCon 2015 学习:Implementing class properties effectively
  • 维度建模是什么意思?如何实现维度建模?
  • Postgresql数据库初体验
  • 全连接网络