信号处理与 signal.h 库

C 语言中的 signal.h 头文件提供了一种处理程序执行期间报告的不同信号的机制。它定义了一些变量类型、宏和函数,让程序能够更灵活地响应来自操作系统或其他进程的信号。

sig_atomic_t 类型

sig_atomic_t 类型是一种在信号处理程序中使用的整数类型。它保证在信号处理程序中访问时是原子性的,即使在异步信号的情况下也能保持一致性。

库宏

SIG_DFL

SIG_DFL 宏表示默认的信号处理程序。

SIG_ERR

SIG_ERR 宏表示一个信号错误。

SIG_IGN

SIG_IGN 宏表示忽略信号。

SIG 宏

SIG 宏用于表示不同条件下的信号码,如下:

  • SIGABRT: 程序异常终止。
  • SIGFPE: 算术运算出错,如除数为 0 或溢出。
  • SIGILL: 非法函数映象,如非法指令。
  • SIGINT: 中断信号,如 ctrl-C。
  • SIGSEGV: 非法访问存储器,如访问不存在的内存单元。
  • SIGTERM: 发送给本程序的终止请求信号。

库函数

signal()

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

void signal_handler(int sig) {
    printf("Received signal: %d\n", sig);
}

int main() {
    // Register signal handler for SIGINT
    signal(SIGINT, signal_handler);

    printf("Signal handling registered. Press Ctrl-C to trigger SIGINT.\n");

    while (1) {
        // Main loop
    }

    return 0;
}

raise()

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

int main() {
    // Raise SIGINT signal
    raise(SIGINT);

    return 0;
}

这些例子展示了如何使用 signal.h 库中的宏和函数来处理信号。signal() 函数用于设置信号处理程序,raise() 函数用于生成指定的信号。通过这些功能,程序可以更好地响应来自操作系统或其他进程的信号,并根据需要采取适当的行动。

在POSIX标准中,对于信号处理函数的注册和执行是在操作系统层面完成的,因此无论调用多少次raise(SIGINT)signal(SIGINT, signal_handler),信号处理函数都只会执行一次。这是因为每个信号在进程中只能有一个相关联的处理函数。

相关推荐
教练、我想打篮球3 天前
68 指针的减法操作
c++·c·struct
科大饭桶4 天前
数据结构自学Day5--链表知识总结
数据结构·算法·leetcode·链表·c
witton6 天前
C语言使用Protobuf进行网络通信
c语言·开发语言·游戏·c·模块化·protobuf·protobuf-c
秋难降8 天前
Python 知识 “八股”:给有 C 和 Java 基础的你😁😁😁
java·python·c
不知所云,8 天前
3. lvgl 9.3 vscode 模拟环境搭建 lv_port_pc_vscode-release-v9.3
ide·vscode·编辑器·c·sdl·lvgl vscode·lvgl模拟器
small_wh1te_coder9 天前
硬件嵌入式学习路线大总结(一):C语言与linux。内功心法——从入门到精通,彻底打通你的任督二脉!
linux·c语言·汇编·嵌入式硬件·算法·c
hie9889411 天前
C语言中的输入输出函数:构建程序交互的基石
c
布多12 天前
内存对齐:程序员必知的性能优化秘籍
性能优化·c
鑫宇吖25 天前
【工具使用-VScode】VScode如何设置空格和tab键显示
vscode·c
GodKK老神灭1 个月前
STM32 实现PID
stm32·单片机·算法·c