例子1
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
void my_func(int sig) {
printf("get %d\n", sig);
}
int main(void) {
signal(SIGINT, my_func);
signal(SIGQUIT, my_func);
pause();
pause();
return 0;
}
例子2
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void my_func(int signum) {
printf("if you want to quit, please try SIGQUIT\n");
}
int main(void) {
sigset_t set, pendset;
struct sigaction action1,action2;
if (sigemptyset(&set) < 0) {
perror("sigemptyset");
exit(1);
}
if (sigaddset(&set, SIGQUIT) < 0) {
perror("sigaddset");
exit(1);
}
if (sigaddset(&set, SIGINT) < 0) {
perror("sigaddset");
exit(1);
}
if (sigismember(&set, SIGINT)) {
sigemptyset(&action1.sa_mask);
action1.sa_handler = my_func;
action1.sa_flags = 0;
sigaction(SIGINT, &action1, NULL);
}
if (sigismember(&set, SIGQUIT)) {
sigemptyset(&action2.sa_mask);
action2.sa_handler = my_func;
action2.sa_flags = 0;
sigaction(SIGQUIT, &action2, NULL);
}
if (sigprocmask(SIG_BLOCK, &set, NULL) < 0) {
perror("sigprocmask");
exit(1);
} else {
printf("Signal set was blocked, press anykey!\n");
getchar();
}
if (sigprocmask(SIG_UNBLOCK, &set, NULL) < 0) {
perror("sigprocmask");
exit(1);
} else {
printf("signal set is in unblock state\n");
}
while(1);
return 0;
}
中断嵌套,当该中断号的中断函数未执行完,又有该信号时,等待执行完毕再响应,不会丢失,不同信号则立刻响应,无需等待。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
void my_func(int signum) {
int count = 10;
printf("signnum is %d\n", signum);
if(signum == 25) {
while(count--) {
printf("signnum is %d count:%d\n", signum, count);
sleep(1);
}
}
}
int main(void) {
sigset_t set;
struct sigaction action1;
if (sigemptyset(&set) < 0) {
perror("sigemptyset");
exit(1);
}
if (sigaddset(&set, 25) < 0) {
perror("sigaddset");
exit(1);
}
if (sigaddset(&set, 26) < 0) {
perror("sigaddset");
exit(1);
}
if (sigismember(&set, 25)) {
sigemptyset(&action1.sa_mask);
action1.sa_handler = my_func;
action1.sa_flags = 0;
sigaction(25, &action1, NULL);
}
if (sigismember(&set, 26)) {
sigemptyset(&action1.sa_mask);
action1.sa_handler = my_func;
action1.sa_flags = 0;
sigaction(26, &action1, NULL);
}
printf("start here\n");
while(1);
return 0;
}