1. Linux信号简介
Linux信号是进程通信的一种机制,用于通知进程发生了某种特定的事件。当一个进程需要向另一个进程发送一个信号时,它可以通过使用系统调用kill()来发送信号。而接收信号的进程可以通过注册信号处理函数来处理收到的信号。Linux提供了大量的信号,每个信号都对应一个特定的事件,如中断,退出等。
1.1 信号的分类
Linux信号可以分为三类:
标准信号:包括常见的信号,如SIGINT,SIGTERM等。
实时信号:提供了更高的优先级,如SIGRTMIN,SIGRTMAX。
自定义信号:可以根据需要自定义的信号。
1.2 信号处理方式
Linux提供了几种信号处理方式:
忽略信号:进程可以选择忽略某个信号,但是有些信号是不可忽略的,如SIGKILL。
捕捉信号:进程可以注册信号处理函数,当收到信号时会执行该函数。
执行系统默认处理方式:进程可以选择使用系统默认的信号处理方式。
2. 信号编程示例
2.1 发送信号的示例
下面是一个简单的示例代码,通过使用kill()系统调用向指定的进程发送信号:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
int main() {
int pid;
pid = fork();
if (pid > 0) {
// 父进程发送SIGINT信号给子进程
kill(pid, SIGINT);
} else if (pid == 0) {
// 子进程收到SIGINT信号后输出消息
signal(SIGINT, handle_signal);
pause();
printf("Child process received SIGINT signal\n");
} else {
printf("Fork failed\n");
return 1;
}
return 0;
}
在上面的示例中,父进程创建了一个子进程,然后通过kill()系统调用向子进程发送了SIGINT信号。
子进程注册了信号处理函数handle_signal(),当收到SIGINT信号时会执行该函数,并输出一条消息。
2.2 接收信号的示例
下面是一个简单的示例代码,用于演示如何接收信号并处理:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void handle_signal(int signum) {
if (signum == SIGINT) {
printf("Received SIGINT signal\n");
}
}
int main() {
signal(SIGINT, handle_signal);
while (1) {
// 进程持续运行
sleep(1);
}
return 0;
}
在上面的示例中,进程通过signal()函数注册了信号处理函数handle_signal(),当收到SIGINT信号时会执行该函数,并输出一条消息。
进程在一个无限循环中持续运行,以便能够接收和处理信号。
3. 常见的Linux信号
下面列举了一些常见的Linux信号及其对应的事件:
SIGHUP(1):终端挂断。
SIGINT(2):由键盘引起的中断(Ctrl+C)。
SIGQUIT(3):由键盘引起的退出(Ctrl+\)。
SIGILL(4):非法指令。
SIGKILL(9):强制终止。
SIGSEGV(11):非法内存访问。
SIGTERM(15):正常终止。
4. 结语
本文介绍了Linux信号的基本概念,包括信号的分类和处理方式。通过示例代码,演示了如何发送和接收信号,并对常见的Linux信号进行了介绍。深入理解和熟练掌握Linux信号的使用对于编写稳定可靠的Linux应用程序非常重要。