Date: 2023.1.18


文章目录

  • 1、介绍
  • 2、如何安装多个处理函数
  • 3、信号列表

转载自:http://imhuchao.com/2300.html

signal作用是为信号注册一个处理器。这里的“信号”是软中断信号,这种信号来源主要有三种:

程序错误:比如除0,非法内存访问。
外部信号:终端Ctrl-C产生的SIGINT信号,定时器产生的SIGALERM。
显示请求:kill函数发送的任意信号。
当kill一个进程的时候,默认会发送SIGTERM信号,此时这个信号只有默认处理操作(SIG_DFL),直接中断进程执行。如果此时该进程正在执行一个任务,直接终止该进程会导致任务没有完成。这个时候为SIGTERM信号注册一个信号处理函数就十分有必要。

1、介绍

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

参数:

sig 要设置信号处理函数的信号。它可以是实现定义值或下例值之一:
SIGABRT
SIGFPE
SIGILL
SIGINT
SIGSEGV
SIGTERM
定义信号类型 (宏常量)

handler 信号处理函数。这必须是下列之一:SIG_DFL 宏。信号处理函数被设为默认信号处理函数。SIG_IGN 宏。忽略信号。指向函数指针。函数签名必须等价于如下:extern “C” void fun(int sig);

返回值:成功时为先前的信号处理函数,失败时为 SIG_ERR (某些实现上能禁用设置信号处理函数)。

使用:使用方法请直接看下面的例子。注册一个信号用于在按下Ctrl-C时不立刻终止进程,而是输出一段文字并sleep一段时间。

#include <signal.h>
#include <unistd.h>
#include <iostream>bool is_stop = false;
void quit_handler(int signo) {is_stop = true;std::cout << "stopping\n";sleep(2);
}int main() {auto prev = signal(SIGINT, quit_handler);if (prev == SIG_ERR) {abort();}while (!is_stop) {std::cout << "running\n";sleep(1);}std::cout << "stopped\n";
}

2、如何安装多个处理函数

signal只能为一个信号添加一个处理函数,添加多个处理函数时后面的函数会覆盖前面的函数。看如下代码

#include <signal.h>
#include <unistd.h>
#include <iostream>bool is_stop = false;
void quit_handler1(int signo) {is_stop = true;std::cout << "handler1\n";sleep(2);
}void quit_handler2(int signo) {is_stop = true;std::cout << "handler2\n";sleep(2);
}int main() {auto prev1 = signal(SIGINT, quit_handler1);auto prev2 = signal(SIGINT, quit_handler2);if (prev1 == SIG_ERR || prev2 == SIG_ERR) {abort();}while (!is_stop) {std::cout << "running\n";sleep(1);}std::cout << "stopped\n";
}

运行之后按下Ctrl-C,结果发现只有handler2有效,handler1失效了。

3、信号列表

Signal Description
SIGABRT 由调用abort函数产生,进程非正常退出
SIGALRM 用alarm函数设置的timer超时或setitimer函数设置的interval timer超时
SIGBUS 某种特定的硬件异常,通常由内存访问引起
SIGCANCEL 由Solaris Thread Library内部使用,通常不会使用
SIGCHLD 进程Terminate或Stop的时候,SIGCHLD会发送给它的父进程。缺省情况下该Signal会被忽略
SIGCONT 当被stop的进程恢复运行的时候,自动发送
SIGEMT 和实现相关的硬件异常
SIGFPE 数学相关的异常,如被0除,浮点溢出,等等
SIGFREEZE Solaris专用,Hiberate或者Suspended时候发送
SIGHUP 发送给具有Terminal的Controlling Process,当terminal 被disconnect时候发送
SIGILL 非法指令异常
SIGINFO BSD signal。由Status Key产生,通常是CTRL+T。发送给所有Foreground Group的进程
SIGINT 由Interrupt Key产生,通常是CTRL+C或者DELETE。发送给所有ForeGround Group的进程
SIGIO 异步IO事件
SIGIOT 实现相关的硬件异常,一般对应SIGABRT
SIGKILL 无法处理和忽略。中止某个进程
SIGLWP 由Solaris Thread Libray内部使用
SIGPIPE 在reader中止之后写Pipe的时候发送
SIGPOLL 当某个事件发送给Pollable Device的时候发送
SIGPROF Setitimer指定的Profiling Interval Timer所产生
SIGPWR 和系统相关。和UPS相关。
SIGQUIT 输入Quit Key的时候(CTRL+\)发送给所有Foreground Group的进程
SIGSEGV 非法内存访问
SIGSTKFLT Linux专用,数学协处理器的栈异常
SIGSTOP 中止进程。无法处理和忽略。
SIGSYS 非法系统调用
SIGTERM 请求中止进程,kill命令缺省发送
SIGTHAW Solaris专用,从Suspend恢复时候发送
SIGTRAP 实现相关的硬件异常。一般是调试异常
SIGTSTP Suspend Key,一般是Ctrl+Z。发送给所有Foreground Group的进程
SIGTTIN 当Background Group的进程尝试读取Terminal的时候发送
SIGTTOU 当Background Group的进程尝试写Terminal的时候发送
SIGURG 当out-of-band data接收的时候可能发送
SIGUSR1 用户自定义signal 1
SIGUSR2 用户自定义signal 2
SIGVTALRM setitimer函数设置的Virtual Interval Timer超时的时候
SIGWAITING Solaris Thread Library内部实现专用
SIGWINCH 当Terminal的窗口大小改变的时候,发送给Foreground Group的所有进程
SIGXCPU 当CPU时间限制超时的时候
SIGXFSZ 进程超过文件大小限制
SIGXRES Solaris专用,进程超过资源限制的时候发

THE END!

【Linux系列】signal函数详解相关推荐

  1. linux signal用法,Linux 信号 signal 用法详解及注意事项

    Linux 信号 signal 用法详解及注意事项 1) SIGHUP 本信号在用户终端连接 (正常或非正常) 结束时发出, 通常是在终端的控 制进程结束时, 通知同一 session 内的各个作业, ...

  2. linux 中 sigaction 函数详解

    linux 中 sigaction 函数详解 一.函数原型 sigaction 函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作) int sigaction(int signum, ...

  3. linux下readlink函数详解

    linux下readlink函数详解 相关函数: stat, lstat, symlink 表头文件: #include <unistd.h> 定义函数:int  readlink(con ...

  4. Linux 文件锁 fcntl 函数详解

    Linux 文件锁 fcntl 函数详解 #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd); ...

  5. Linux中fork()函数详解

    Linux中fork()函数详解 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事, ...

  6. linux 系统函数调用脚本文件,Linux系统调用fsync函数详解

    Linux系统调用fsync函数详解 发布时间:2013-11-14 19:55:10   作者:佚名   我要评论 Linux fsync函数主要用于将同步内存中所有已修改的文件数据到储存设备,多用 ...

  7. Linux下system () 函数详解简介

    (执行shell 命令) 相关函数 fork,execve,waitpid,popen 表头文件 #include<stdlib.h> 定义函数 int system(const char ...

  8. signal函数详解

    SIGABRT 进程停止运行 6 SIGALRM 警告钟 SIGFPE 算述运算例外 SIGHUP 系统挂断 SIGILL 非法指令 SIGINT 终端中断 2 SIGKILL 停止进程(此信号不能被 ...

  9. linux中sigaction函数详解

    一.函数原型:sigaction函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作) int sigaction(int signum, const struct sigaction * ...

最新文章

  1. 如何在Linux系统上部署接口测试环境
  2. 《SpringMVC数据绑定入门》笔记
  3. Win Server 2008中开启Areo特效
  4. python输入水果数量_Python 水果统计
  5. 提高ASP.net性能的十种方法
  6. python3一爬虫库url_python3爬虫之Urllib库(一)
  7. C++ ---------- map的使用
  8. Android安全-代码安全1-ProGuard混淆处理
  9. 中医笔记2-入定、打坐
  10. 一、时间序列(1)资产收益率、随机过程、白噪声序列定义
  11. 解决:Windows打开文件时选择打开方式-》选择其他应用-》时出现无效应用。
  12. 谷歌浏览器怎么保存网页本身或链接?
  13. PgAdmin导入导出单表数据---解决PgAdmin导入单表数据报错乱码问题
  14. ios开发愤怒的小鸟的Lua语言:Wax框架详解
  15. grpc进阶篇之resolver
  16. 一文带你入坑全链路监控,skywalking
  17. Azure NSG网络安全组日志分析
  18. 电子电气架构——Vector ODX诊断数据库解决方案和操作指南
  19. 四阶魔方java1002四阶魔方java_4x4四阶魔方一看就懂,超简单入门图文教程1:基本知识和操作...
  20. 基于忆阻器的神经网络应用研究!道翰天琼认知智能机器人平台API接口大脑为您揭秘。

热门文章

  1. 经典卷积神经网络(CNN)图像分类算法详解
  2. carla学习笔记(八)
  3. 分解质因数Java_Java 分解质因数
  4. 计算机个性化桌面,良好的个性化桌面图标管理软件排行榜
  5. 正则表达式的字符串匹配
  6. VS2019 / 2017 / 2013 产品密钥 – 所有版本
  7. C10K Problem
  8. 知识管理对企业意味着什么
  9. vue中image 的:src 与 src
  10. 系统盘修复计算机命令,win10系统无法正常开机提示引导文件丢失使用命令修复的方法 无需U盘...