软中断通信简介
软中断通信是进程间通信的一种常见方式,它基于信号机制,允许不同进程之间进行通信。在软中断通信中,一个进程向另一个进程发送特定的信号,接收进程捕获信号并执行相应的处理。
软中断通信的实现步骤如下:
- 信号发送:发送进程使用
kill()
函数向接收进程发送信号,信号类型可以自行指定。 - 信号接收:接收进程可以通过
signal()
函数注册对应信号的处理函数,或者使用类似函数指定对应信号的处理方式。 - 信号处理:接收进程收到信号后,操作系统会暂停其正常执行流程,转而执行对应信号的处理函数或处理方式。
- 恢复执行:处理完信号后,操作系统会恢复接收进程的正常执行流程。
signal()函数概述
signal()
函数是UNIX/Linux系统中用于注册信号处理程序的系统调用。信号是操作系统中的一种通知机制,用于通知进程发生了某些事件,如接收到外部中断或其他进程发送的信号。
signal()
函数的原型为:
Codevoid (*signal(int signum, void (*handler)(int)))(int);
其中,signum
为信号编号,handler
为信号处理程序,可以是函数指针、SIG_IGN
(忽略信号)或SIG_DFL
(默认处理方式)。
除了signal()
函数外,还有一些类似的函数,用于处理进程中的信号,如sigaction
、sigprocmask
、sigsuspend
、sigqueue
和raise
。
signal()与常见信号
SIGINT
SIGINT是由键盘生成的中断信号,通常由用户按下Ctrl C组合键发送给前台进程组的所有进程。以下是一个简单的SIGINT示例代码:
代码语言:c复制#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
void sigint_handler(int signum) {
printf("Received SIGINT signal. Terminating.n");
exit(0);
}
int main() {
signal(SIGINT, sigint_handler);
printf("Press Ctrl C to terminate the program.n");
while (1) {
// Do nothing
}
return 0;
}
SIGTERM
SIGTERM是进程终止时发送给进程的终止信号。以下是一个简单的SIGTERM示例代码:
代码语言:c复制#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void sigterm_handler(int signum) {
printf("Received SIGTERM signal, terminating process...n");
exit(0);
}
int main() {
signal(SIGTERM, sigterm_handler);
printf("Process is running...n");
while(1) {
// Process operations
sleep(1);
}
return 0;
}
SIGALRM
SIGALRM是定时器信号,当alarm()或setitimer()设置的计时器到时时,会发送SIGALRM信号。以下是一个简单的SIGALRM示例代码:
代码语言:c复制#include <stdio.h>
#include <unistd.h>
#include <signal.h>
void sigalrm_handler(int signo) {
printf("Caught SIGALRM signal.n");
// Reset timer
// alarm(5);
exit(0);
}
int main() {
alarm(5); // Set timer
signal(SIGALRM, sigalrm_handler); // Register signal handler
while(1) {
sleep(1); // Wait for signal
}
return 0;
}
SIGQUIT
SIGQUIT信号是终止进程的信号,可以通过在终端中按下Ctrl (CTRL 反斜线)来发送。以下是一个简单的SIGQUIT示例代码:
代码语言:c复制#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
void quit_handler(int signum) {
printf("Received SIGQUIT signal (%d), terminating.n", signum);
exit(0);
}
int main() {
signal(SIGQUIT, quit_handler);
printf("Press Ctrl \ to terminate the program.n");
while (1) {
// Process operations
}
return 0;
}
SIG_IGN使用
使用SIG_IGN参数可以忽略特定信号,使得程序不受其影响。例如,以下代码忽略了SIGQUIT信号:
代码语言:javascript复制signal(SIGQUIT, SIG_IGN);