📜  信号函数 - C 编程语言(1)

📅  最后修改于: 2023-12-03 15:36:43.078000             🧑  作者: Mango

信号函数 - C 编程语言

信号函数是在 Linux 系统中使用的一种函数,它可以使程序在接收到特定的信号时执行特定的操作。信号函数的使用可以帮助程序员更好地管理和控制程序的行为。

信号函数的基本使用

下面是一个简单的信号函数示例,它会在程序接收到 SIGINT 信号时输出一条消息。

#include <stdio.h>
#include <signal.h>

void sigint_handler(int sig) {
    printf("Received SIGINT signal\n");
}

int main() {
    signal(SIGINT, sigint_handler);

    while (1) {
        // 程序其他的逻辑
    }

    return 0;
}

这个程序中,我们首先定义了一个名为 sigint_handler 的函数,它会在接收到 SIGINT 信号时被调用。接着,在 main 函数中,我们使用 signal 函数将 sigint_handler 函数与 SIGINT 信号关联起来。最后,我们在程序的主循环中执行其他的逻辑,等待信号的到来。

常用信号及其含义

下面是一些常用的信号及其含义:

| 信号名称 | 含义 | | :------- | :----------------------------------------------------------- | | SIGINT | 中断信号,通常由用户在控制台上按 Ctrl+C 触发 | | SIGTERM | 终止信号,用于请求程序安全终止 | | SIGHUP | 终端挂起,当终端连接结束时,终端驱动程序通常会给前台进程组发送该信号 | | SIGKILL | 强制终止信号,不可被忽略或捕获 | | SIGQUIT | 退出信号,由用户在控制台上按 Ctrl+\ 触发 |

信号的捕获和忽略

除了使用 signal 函数将信号关联到特定的处理函数之外,还可以使用 sigaction 函数来进一步控制信号的处理方式。使用 sigaction 函数可以实现对信号的捕获、忽略、以及对信号处理函数的修改和替换等操作。

下面是一个简单的使用 sigaction 函数的例子,它会在程序接收到 SIGINT 信号时忽略掉该信号。

#include <stdio.h>
#include <signal.h>

void sigint_handler(int sig) {
    // do nothing
}

int main() {
    struct sigaction sa;
    sa.sa_handler = sigint_handler;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;

    sigaction(SIGINT, &sa, NULL);

    while (1) {
        // 程序其他的逻辑
    }

    return 0;
}

在这个例子中,我们首先定义了一个名为 sigint_handler 的空处理函数,它不执行任何操作。然后,我们使用 sigaction 函数将 SIGINT 信号关联到这个处理函数上。在 sigaction 函数中,我们将 sa_handler 字段设为 sigint_handler,表示将该信号捕获并交由这个处理函数处理。同时,我们使用 sigemptyset 函数初始化了 sa_mask 字段,表示在处理 SIGINT 信号时不屏蔽任何其他信号。最后,我们在程序的主循环中执行其他的逻辑,实现对 SIGINT 信号的忽略。