📅  最后修改于: 2023-12-03 14:59:48.395000             🧑  作者: Mango
在 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++ 中的信号处理的介绍,希望可以对程序员有所帮助。