信号处理与 signal.h 库

简介: 信号处理与 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()

#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()

#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),信号处理函数都只会执行一次。这是因为每个信号在进程中只能有一个相关联的处理函数。

相关文章
|
设计模式 Unix Shell
ECF机制:信号 (Signal)
ECF机制:信号 (Signal)
181 0
|
Kubernetes Java Shell
Dumb-Init进程信号处理
本文讲的是Dumb-Init进程信号处理【编者的话】随着Docker及Kubernetes技术发展的越来越成熟稳定,越来越多的公司开始将Docker用于生产环境的部署,相比起物理机上直接部署,多了一层Docker容器的环境,这就带来一个问题:进程信号接收与处理。
2134 0
|
2月前
|
Linux 程序员 API
信号的机制——信号处理函数的注册
【9月更文挑战第17天】在 Linux 系统中,信号用于响应各种事件,可通过 `kill -l` 查看所有信号。每个信号有唯一 ID 及默认操作,如终止(Term)或生成核心转储(Core)。进程可执行默认操作、捕获信号或忽略信号,但无法忽略 SIGKILL 和 SIGSTOP。常用 `signal` 或 `sigaction` 函数注册信号处理函数,后者更灵活且推荐使用。信号处理涉及系统调用和内核设置,建议根据需求定制参数。
|
3月前
【qt】QTcpSocket相关的信号
【qt】QTcpSocket相关的信号
20 0
|
4月前
|
Python
`scipy.signal`模块是SciPy库中的一个子模块,它提供了信号处理、滤波、频谱分析等功能。这个模块包含了许多用于信号处理的函数和类,其中`butter()`和`filtfilt()`是两个常用的函数。
`scipy.signal`模块是SciPy库中的一个子模块,它提供了信号处理、滤波、频谱分析等功能。这个模块包含了许多用于信号处理的函数和类,其中`butter()`和`filtfilt()`是两个常用的函数。
|
6月前
|
监控 网络协议 iOS开发
Signal 13 was raised(SIGPIPE管道破裂)
Signal 13 was raised(SIGPIPE管道破裂)
106 0
|
6月前
|
Unix Linux Go
Go Signal信号处理
Go Signal信号处理
79 0
|
存储 固态存储 Linux
深入学习tombstone和signal
深入学习tombstone和signal
深入学习tombstone和signal
|
Linux
【Linux信号专题】三、未决信号集、阻塞信号集与信号集操作函数
【Linux信号专题】三、未决信号集、阻塞信号集与信号集操作函数
361 0
【Linux信号专题】三、未决信号集、阻塞信号集与信号集操作函数
|
物联网 Linux 开发者
signal 函数1|学习笔记
快速学习 signal 函数1
signal 函数1|学习笔记