信号是软件中断, 提供了一种处理异步事件的方法
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;
}