linux

C++ Linux编程中如何处理信号

小樊
48
2025-03-25 02:57:11
栏目: 编程语言

在C++ Linux编程中,处理信号(signals)是一种常见的需求,因为它们允许程序响应各种系统事件,如中断、终止请求等。以下是处理信号的基本步骤和示例代码:

1. 包含必要的头文件

首先,你需要包含处理信号所需的头文件:

#include <csignal>
#include <iostream>

2. 定义信号处理函数

定义一个函数来处理特定的信号。这个函数的原型通常是:

void signalHandler(int signum);

其中 signum 是接收到的信号编号。

3. 注册信号处理函数

使用 signalsigaction 函数来注册信号处理函数。sigaction 提供了更细粒度的控制,推荐使用。

使用 signal 函数

#include <csignal>
#include <iostream>

void signalHandler(int signum) {
    std::cout << "Interrupt signal (" << signum << ") received.\n";

    // 清理并关闭
    // 终止程序
    exit(signum);
}

int main() {
    // 注册信号 SIGINT 的处理函数
    signal(SIGINT, signalHandler);

    std::cout << "Program is running. Press Ctrl+C to interrupt.\n";

    while (true) {
        // 主循环
    }

    return 0;
}

使用 sigaction 函数

#include <csignal>
#include <iostream>

void signalHandler(int signum) {
    std::cout << "Interrupt signal (" << signum << ") received.\n";

    // 清理并关闭
    // 终止程序
    exit(signum);
}

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

    // 注册信号 SIGINT 的处理函数
    if (sigaction(SIGINT, &sa, NULL) == -1) {
        perror("sigaction");
        exit(EXIT_FAILURE);
    }

    std::cout << "Program is running. Press Ctrl+C to interrupt.\n";

    while (true) {
        // 主循环
    }

    return 0;
}

4. 处理多个信号

你可以为不同的信号注册不同的处理函数。例如:

#include <csignal>
#include <iostream>

void signalHandlerSIGINT(int signum) {
    std::cout << "SIGINT signal (" << signum << ") received.\n";
}

void signalHandlerSIGTERM(int signum) {
    std::cout << "SIGTERM signal (" << signum << ") received.\n";
}

int main() {
    struct sigaction saSIGINT, saSIGTERM;

    saSIGINT.sa_handler = signalHandlerSIGINT;
    sigemptyset(&saSIGINT.sa_mask);
    saSIGINT.sa_flags = 0;

    saSIGTERM.sa_handler = signalHandlerSIGTERM;
    sigemptyset(&saSIGTERM.sa_mask);
    saSIGTERM.sa_flags = 0;

    if (sigaction(SIGINT, &saSIGINT, NULL) == -1) {
        perror("sigaction SIGINT");
        exit(EXIT_FAILURE);
    }

    if (sigaction(SIGTERM, &saSIGTERM, NULL) == -1) {
        perror("sigaction SIGTERM");
        exit(EXIT_FAILURE);
    }

    std::cout << "Program is running. Press Ctrl+C or send SIGTERM to terminate.\n";

    while (true) {
        // 主循环
    }

    return 0;
}

5. 注意事项

通过以上步骤,你可以在C++ Linux编程中有效地处理信号。

0
看了该问题的人还看了