linux 信号

 

信号是软件中断, 提供了一种处理异步事件的方法

signal

void (*signal (int sig, void (*func)(int)))(int);

signal(registered signal, signal handler)

第一个参数是一个整数, 代表了信号的编号;第二个参数是一个指向信号处理函数的指针

signal.c

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>

static void sig_usr(int signo) {
    if(signo == SIGUSR1) {
        printf("received SIGUSER1\n");
    } else if (signo == SIGUSR2) {
        printf("received SIGUSER2\n");
    } else {
        printf("received signal %d\n", signo);
    }
}

int main(int argv, char *argc[]) {
    if (signal(SIGUSR1, sig_usr) == SIG_ERR) {
        perror("can't catch SIGUSR1");
    }
    if (signal(SIGUSR2, sig_usr) == SIG_ERR) {
        perror("can't catch SIGUSR2");
    }
    for(;;) {
        pause();
    }
    return 0;
}

运行结果

dmjcb@Casper:~/Test$ ./Signal &
[2] 302991
dmjcb@Casper:~/Test$ kill -USR1 302991
dmjcb@Casper:~/Test$ received SIGUSER1
^C
dmjcb@Casper:~/Test$ kill -USR1 302991
received SIGUSER1
dmjcb@Casper:~/Test$ kill -USR2 302991
received SIGUSER2
dmjcb@Casper:~/Test$ kill 302991

raise

int raise (signal sig);

sig 是要发送的信号的编号, 信号包括:

SIGINT, SIGABRT, SIGFPE, IGILL, SIGSEGV, SIGTERM, SIGHUP

#include<stdio.h>
#include<signal.h>
#include<unistd.h>
 
void signalHandler(int signum){
    printf("Interrupt signal %d received\n", signum);
    // 清理并关闭
    exit(signum);
 

int main(void){
    // 注册信号 SIGINT 和信号处理程序
    signal(SIGINT, signalHandler);
 
    for(int i = 0; i < 5; i++){
        printf("Going to sleep...\n");
        if(i == 3){
           raise(SIGINT);
        }
        sleep(1);
    }
    return 0;
}