先过我这一关 - 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 来增加兼容性。

相关推荐
charlie1145141912 小时前
嵌入式Linux驱动开发指南02——内核空间基础与硬件访问
linux·运维·c语言·驱动开发·嵌入式硬件
少司府2 小时前
C++基础入门:内存管理
c语言·开发语言·c++·内存管理·delete·new·malloc
鱼很腾apoc2 小时前
【学习篇】第17期 C++入门必看——类和对象全站最详篇
c语言·开发语言·学习·算法·青少年编程
Sakuyu434682 小时前
C语言基础(一)
c语言·开发语言
码农的神经元2 小时前
2026 MathorCup C 题实战复盘:从高血脂风险预警到 6 个月干预优化的建模思路与 Python 落地
c语言·开发语言·python
良木生香3 小时前
【C++初阶】C++编程基石:编码表&&STL的入门指南
c语言·开发语言·数据结构·c++·算法
达帮主3 小时前
19.1 C语言链表 -- 简单
c语言·开发语言·链表
爱编码的小八嘎4 小时前
C语言完美演绎8-8
c语言
达帮主5 小时前
25.C语言 递归函数
c语言·开发语言·汇编
yunhuibin5 小时前
Linux 7.0 调度器:C 语言面向对象(OOPC)的极致实践
linux·运维·c语言