📜  C++ 中的信号处理(1)

📅  最后修改于: 2023-12-03 14:59:48.395000             🧑  作者: Mango

C++ 中的信号处理

在 C++ 中,信号处理是一种处理异步事件的机制。当某个进程接收到信号时,它会根据事先设置的信号处理程序来处理这个信号。

C++ 中的信号处理需要使用到系统头文件 signal.h,并通过调用 signal 函数来设置信号处理程序。

设置信号处理程序

信号处理程序是一个函数,当进程接收到指定的信号时,就会调用这个函数。可以通过以下方式设置信号处理程序:

#include <signal.h>

// signal 函数原型
void (*signal(int sig, void (*func)(int)))(int);

在 signal 函数中,sig 参数指定了要处理的信号,func 参数是一个函数指针,指向信号处理程序函数。由于信号处理程序是一个 void 类型的函数,它需要传递一个 int 类型的参数,表示接收到的信号。

例如,以下代码设置了 SIGINT 信号的处理程序为 handle_signal 函数:

#include <iostream>
#include <signal.h>

void handle_signal(int signal) {
  std::cout << "Received signal: " << signal << std::endl;
}

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

  while (true) {};

  return 0;
}

在上面的例子中,handle_signal 函数会输出接受到的信号编号。

常见的信号

下表列出了 Linux 中常见的信号及其编号:

|信号|编号|用途| |:-:|:-:|:--| |SIGHUP|1|挂起进程| |SIGINT|2|中断进程(比如通过 CTRL+C)| |SIGQUIT|3|终止进程,但会生成 core 文件| |SIGKILL|9|强制终止进程| |SIGTERM|15|终止进程| |SIGSEGV|11|无效的内存引用| |SIGALRM|14|时钟定时器信号| |SIGUSR1|10|用户自定义信号1| |SIGUSR2|12|用户自定义信号2|

发送信号

可以使用 kill 函数向其他进程或当前进程发送信号:

#include <iostream>
#include <signal.h>
#include <unistd.h>

int main() {
  // 向当前进程发送 SIGINT 信号
  kill(getpid(), SIGINT);

  return 0;
}

在上面的例子中,调用 kill 函数发送了一个 SIGINT 信号给当前进程。

注意事项
  • 信号处理程序应该尽量简单,不要做太过复杂的操作。
  • 信号处理程序应该使用可重入函数,并且应该避免调用 malloc
  • 必须总是设置信号处理程序。如果不设置,进程会使用默认的处理程序,这通常不是你想要的。

以上是 C++ 中的信号处理的介绍,希望可以对程序员有所帮助。