软中断通信简介

2024-04-22 18:27:48 浏览数 (1)

软中断通信简介

软中断通信是进程间通信的一种常见方式,它基于信号机制,允许不同进程之间进行通信。在软中断通信中,一个进程向另一个进程发送特定的信号,接收进程捕获信号并执行相应的处理。

软中断通信的实现步骤如下:

  1. 信号发送:发送进程使用kill()函数向接收进程发送信号,信号类型可以自行指定。
  2. 信号接收:接收进程可以通过signal()函数注册对应信号的处理函数,或者使用类似函数指定对应信号的处理方式。
  3. 信号处理:接收进程收到信号后,操作系统会暂停其正常执行流程,转而执行对应信号的处理函数或处理方式。
  4. 恢复执行:处理完信号后,操作系统会恢复接收进程的正常执行流程。

signal()函数概述

signal()函数是UNIX/Linux系统中用于注册信号处理程序的系统调用。信号是操作系统中的一种通知机制,用于通知进程发生了某些事件,如接收到外部中断或其他进程发送的信号。

signal()函数的原型为:

代码语言:c复制
Codevoid (*signal(int signum, void (*handler)(int)))(int);

其中,signum为信号编号,handler为信号处理程序,可以是函数指针、SIG_IGN(忽略信号)或SIG_DFL(默认处理方式)。

除了signal()函数外,还有一些类似的函数,用于处理进程中的信号,如sigactionsigprocmasksigsuspendsigqueueraise

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);

0 人点赞