文章目录

  • 描述
  • 声明
  • 参数
  • 返回值
  • 实例
  • 附加解释
  • 背景知识:C语言中signal函数简介及使用

描述

C 库函数 void (*signal(int sig, void (*func)(int)))(int) 设置一个函数来处理信号,即带有 sig 参数的信号处理程序。

声明

下面是 signal() 函数的声明。

void (*signal(int sig, void (*func)(int)))(int)

参数

  • sig – 在信号处理程序中作为变量使用的信号码。下面是一些重要的标准信号常量:
  • func – 一个指向函数的指针。它可以是一个由程序定义的函数,也可以是下面预定义函数之一:

返回值

该函数返回信号处理程序之前的值,当发生错误时返回 SIG_ERR。

实例

下面的实例演示了 signal() 函数的用法。(在linux下运行,windows没有unistd.h头文件)

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>void sighandler(int);int main()
{signal(SIGINT, sighandler);while(1) {printf("开始休眠一秒钟...\n");sleep(1);}return(0);
}void sighandler(int signum)
{printf("捕获信号 %d,跳出...\n", signum);exit(1);
}
让我们编译并运行上面的程序,这将产生以下结果,且程序会进入无限循环,需使用 CTRL + C 键跳出程序。开始休眠一秒钟...
开始休眠一秒钟...
开始休眠一秒钟...
开始休眠一秒钟...
开始休眠一秒钟...
捕获信号 2,跳出...

我在linux下编译运行,还真是这样子:

[root@ubuntu /home/yg/arnold_test/20211201_TEST_signal]3# gcc TEST_SIGNAL.c
[root@ubuntu /home/yg/arnold_test/20211201_TEST_signal]4#
[root@ubuntu /home/yg/arnold_test/20211201_TEST_signal]4#
[root@ubuntu /home/yg/arnold_test/20211201_TEST_signal]4# ./a.out
开始休眠一秒钟...
开始休眠一秒钟...
开始休眠一秒钟...
开始休眠一秒钟...
开始休眠一秒钟...
开始休眠一秒钟...
^C捕获信号 2,跳出...

附加解释

void (*signal(int sig, void (*func)(int)))(int)

解释一下该函数的申明怎么读,后面附带的两个(int)的意思是:该符号前的函数指针所对应的函数是带一个int类型的参数的。比如最外面的,是说signal返回的函数指针所对应的函数是带int的参数的;里面的,作为参数的函数名是带一个int参数的。

  • 中间部分:
signal( int sig, void (*func)(int))

signal函数有2个参数,第一个是int,第二个是无返回值,带一个int参数的函数指针

  • 外围:
void   (*signal(xxx))   (int)

signal函数返回的是一个函数指针,无返回值,有一个int参数

  • 简化:
typedef void Sigfunc(int)

Sigfunc就代表的就是一个 返回值是一个无返回值,有一个int参数的函数。

最后就成了这样:

Sigfunc *signal(int, Sigfunc*)

参考文章:C 库函数 - signal()

背景知识:C语言中signal函数简介及使用

signal.h是C标准函数库中的信号处理部分,定义了程序执行时如何处理不同的信号。信号用作进程间通信,报告异常行为(如除零)、用户的一些按键组合(如同时按下Ctrl与C键,产生信号SIGINT)。C++中的对应头文件是csignal。

C语言标准定义了6个信号,都定义在signal.h头文件中:

(1). SIGABRT:程序异常中止,如调用abort函数。(abort)

(2). SIGFPE:算术运算出错,如除数为0或溢出。

(3). SIGILL:非法函数映像,如非法指令。

(4). SIGINT:交互的用户按键请求,如同时按下Ctrl+C键。

(5). SIGSEGV:无效内存访问,段错误。

(6). SIGTERM:程序的中止请求。

signal.h可能还定义了其它信号,这依赖于具体实现。例如,类Unix系统还定义了15个以上的信号。Visual C++的C标准库只支持C语言标准规定的6个信号,即对信号处理只提供最小的支持。

signal函数:该函数设置一个函数(回调函数)来处理捕获到异常信号时需要执行的操作

参考文章:C语言中signal函数简介及使用

C语言signal()函数(通过设置一个函数(回调函数)来处理捕获到异常信号时需要执行的操作)相关推荐

  1. zmq 接口函数之 :zmq_socket_monitor - 注册一个监控回调函数

    ZeroMQ 官方地址 :http://api.zeromq.org/4-2:zmq-socket-monitor zmq_socket_monitor(3) ØMQ Manual - ØMQ/4.1 ...

  2. 函数模板案例_利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试

    案例描述: 利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试 #include <iostream& ...

  3. php回调函数的作用域,PHP将回调函数作用到给定数组单元的方法

    PHP将回调函数作用到给定数组单元的方法 数组是PHP程序设计中十分重要的一环.本文介绍PHP中数组函数array_map()的用法,实现将回调函数作用到给定数组单元上.具体如下: array arr ...

  4. 回调函数 —— 借助中间通用函数(形参里有函数指针,实现函数注册)调用不同的回调函数 (多态/分层)

    回调函数传参:函数指针做函数参数(回调函数) 目录 背景 回调函数是实现函数分层且单向依赖的好办法,使用函数指针运行 struct结构体回调函数代码更清晰 简单理解回调函数 Demo 其他回调函数博文 ...

  5. 函数指针的使用精髓 -- 回调函数+qsort的内部实现

    前言: 我们有普通指针(存放普通变量的地址).数组指针(存放数组的地址)... ... 那函数的地址可以存起来吗?可以的话该怎么用函数指针呢?这是本篇博客探讨的问题... 目录:​​​​​​​ 一.函 ...

  6. C语言之回调函数(非常重要)附带回调函数版本实现整型的加减乘除四则运算

    对于回调函数!想必大家的第一想法,想必就是函数吧!其实这个也是笔者的第一想法,毕竟之前没有见过回调函数,所以就不怎么知道细节!默认为直接调用函数,就是回调函数,但等学会了回调函数,其实就不是这样想了! ...

  7. java回调函数的生命_Java的回调函数 - choaklin 的个人空间 - OSCHINA - 中文开源技术交流社区...

    暂且不提回调函数的各种定义,如我本人,虽然知道JavaScript的回调的使用,但是百科了回调的定义,还是觉得云里来雾里去.所以大可先从已熟悉的入手,旁推侧引它的原理,再引出Java版的实现. 因为博 ...

  8. 什么是回调函数?为什么要使用回调函数?如何使用回调函数?

    1. 什么是回调函数: 函数指针的调用,即是一个通过函数指针调用的函数: 如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就说这是回调函数. In compu ...

  9. html里的回调函数的作用域,异步与回调/函数的作用域链

    异步与回调/函数的作用域链 JavaScript 只在一个线程上运行,JavaScript 同时只能执行一个任务,其他任务都必须在后面排队等待. 这种模式的好处是实现起来比较简单,执行环境相对单纯:坏 ...

最新文章

  1. java编译器 Javac 编译原理
  2. Shell编程基入门
  3. asp 之 让实体中字段类型为DateTime的字段仅仅显示日期不显示时间
  4. swift怎么调用Java,Swift完成UIAlertController的调用
  5. scp命令默认传输速度多大_每天一个linux命令(60):scp命令
  6. sqlserver java odbc_Java JDBC------------------ODBC(SQLServer)链接
  7. 10个精妙的Java编码最佳实践
  8. django orm 之makemigrations和migrate命令
  9. 测试开发必备技能-Jmeter二次开发
  10. 机器人环境感知算法之算法分析阶段
  11. [示例代码]植物大战僵尸网页版
  12. 【深度学习】数据读取与数据扩增方法
  13. Zend Studio 13.6.1下载和安装汉化破解版
  14. (转)EditText属性详解
  15. 以太坊之Remix部署智能合约(Remix简介,使用,测试网络部署合约)
  16. Google - Guice 入门介绍
  17. 沈阳地铁行业运行状况与发展模式调研报告2022版
  18. pycharm代码自动添加时间及日期
  19. ubantu 添加防火墙策略_linux - 如何在Ubuntu上设置简单的防火墙? - Ubuntu问答
  20. 易语言视频教程(黑旋易语言教程)一套

热门文章

  1. iPhone开发中的一些小技巧
  2. 路由器命令大全手册教程 4
  3. new 开始转向PHP
  4. ip pim spare 源树 和 共享树_iPhone通过内置应用与电脑传输共享文件指南
  5. 自由自在休闲食品意式手工冰淇淋 百变不离健康
  6. SAP ABAP技能树
  7. WebService入门详解
  8. SAP科目的行项目显示未勾选补救步骤
  9. 用“龙头”促发展,以“立体”筑生态,长沙生物医药产业集群跑出“加速度”
  10. 高压线下,恶俗短视频为何仍在批量生产?