先过我这一关 - signal

先过我这一关 - signal

在运行程序的时候,一般都知道运行 Ctrl+C 八成就会把程序给中断,类似于应用程序里面的CLOSE ,但是如果有些数据在运行过程中没有保存,就会比较尴尬,此时就需要借助signal同学,让他对企图不小心中断程序时先去做一些操作,别直接退出,完成后再安全退出。

基本语法

c 复制代码
//#include <signal.h>
//void (*signal(int sig, void (*func)(int)))(int);

#include <signal.h>

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);
  • signum 是需要处理的信号,比如 SIGINT(通常是Ctrl+C产生的中断信号)。
  • handler 是一个指向函数的指针,这个函数的任务是处理信号。这个处理函数需要一个整型参数(信号的编号),返回信号的句柄,或者在出错时返回SIG_ERR

当信号 signum 被捕获时,系统将调用 handler 指向的函数。如果 handerSIG_IGN,则信号将被忽略;如果是 SIG_DFL,则执行该信号的默认操作。

示例代码

下面是一个使用 signal 的示例,这段代码演示了如何捕获 SIGINT 信号,并定义一个简单的信号处理函数来处理用户的中断信号。

c 复制代码
#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void handle_sigint(int sig) {
    printf("### \n");
    printf("### Oops! You hit Ctrl+C! But I will not quit cause I am rnning. Signal %d received.\n", sig);
    printf("### Save your work at first before close the application!!!\n");
    printf("### \n");
}

int main() {
    signal(SIGINT, handle_sigint); 
    while (1) {
        printf("Program running... \n");
        printf("Try press Ctrl+C to see can you stop me\n");
        sleep(1);  
    }
    return 0;
}

在这个程序中,signal 函数被用来设置 SIGINT(由 Ctrl+C 触发)的处理函数为 handle_sigint。这意味着当用户按下 Ctrl+C 时,不会像通常那样终止程序,而是调用 handle_sigint 函数。函数接收一个整型参数 signum,它是被捕获的信号的编号。

程序将进入一个无限循环,每秒输出 "Program running... "这个提示词,并通过 sleep(1) 暂停一秒。在这期间,如果程序接收到信号,将执行相应的处理函数。

注意

不过在多线程环境中使用 signal 可能会有问题,另外 signal 函数有可能会有可移植性问题,所以可以考虑使用 sigaction 来增加兼容性。

相关推荐
M78佐菲7 小时前
c语言学习笔记:排序与查找方法整理
linux·c语言·笔记·学习·算法
wWYy.8 小时前
C++与C的区别
c语言·c++
LuminousCPP9 小时前
数据结构‑二叉树(二):二叉堆从零实现|Heap结构设计 + 建堆优化 + 堆排序深度解析
c语言·数据结构·笔记·二叉树
程序员与背包客_CoderZ12 小时前
高性能分布式KV存储引擎RocksDB入门与C/C++编码实战
c语言·开发语言·数据库·c++·分布式·分布式数据库·rocksdb
william_yangshun12 小时前
【大模型部署实战】kimi-k3-in-c 中文版:用 176KB 纯 C99 引擎在 CPU 上跑 Kimi K3 上手指南
c语言·开发语言
Yyyyyy~14 小时前
【C语言】数据类型和变量【下】
c语言
小雪崩16 小时前
嵌入式学习 day30:minilog
linux·c语言·学习
二级小助手21 小时前
C语言二级操作题高频真题精解与大题代码模板
c语言·计算机二级·二级c语言·c语言操作题·c语言真题·c语言大题
kkkkkkkkkk_Z1 天前
学嵌入式和C语言编程数据结构|学习日记Day22:栈,二叉树,哈希存储
c语言·数据结构·学习
Navigator_Z1 天前
LeetCode //C - 1206. Design Skiplist
c语言·算法·leetcode