int main(int argc, char *argv[]) { struct sigaction act; act.sa_handler = handler; sigemptyset(&act.sa_mask); act.sa_flags = 0; sigset_t pset, oldset, newset; sigemptyset(&newset); sigaddset(&newset, SIGINT); sigaddset(&newset, SIGRTMIN); sigprocmask(SIG_BLOCK, &newset, &oldset); // 将block位置1,因为信号尚未产生,此时未决位都为0 if (sigaction(SIGINT, &act, NULL) < 0) ERR_EXIT("sigaction error"); if (sigaction(SIGRTMIN, &act, NULL) < 0) ERR_EXIT("sigaction error"); if (sigaction(SIGUSR1, &act, NULL) < 0) ERR_EXIT("sigaction error"); for (; ;) { printf("this is main blockmask\n"); printsigset(&oldset); //全0 printsigset(&newset); //两位为1 printf("this is main sigpending\n"); sigpending(&pset); printsigset(&pset); // 全0 sleep(1); } return 0; }
void handler(int sig) { if (sig == SIGINT || sig == SIGRTMIN) { printf("rev sig=%d\n", sig); printf("this is SIGINT | SIGRTMIN blockmask\n"); printsigset(&oldset); //即main里面的newset printsigset(&newset); //block位依然为1 printf("this is SIGINT | SIGRTMIN sigpending\n"); sigpending(&pset); // SIGINT or SIGRTMIN的未决位为0 printsigset(&pset); } else if (sig == SIGUSR1) { sigemptyset(&newset); sigaddset(&newset, SIGINT); sigaddset(&newset, SIGRTMIN); sigprocmask(SIG_UNBLOCK, &newset, &oldset); // 上句只是将未决标志位清0,block位依然为1,当处理SIGUSR1期间还会将此位置1 // 此句结束立马先执行SIGINT or SIGRTMIN 的信号处理函数(开辟新的函数栈) // 再接下去执行 printf("this is SIGUSR1 blockmask\n"); printsigset(&oldset); printsigset(&newset); //block位依然为1 printf("this is SIGUSR1 sigpending\n"); sigpending(&pset); //信号全部处理完毕,故未决位都为0 printsigset(&pset); } }
int main(void) { sigset_t s,p; sigemptyset(&s); sigaddset(&s,SIGINT); sigaddset(&s,SIGABRT); sigprocmask(SIG_BLOCK,&s,NULL); while(1){ sigpending(&p); printsigset(&p); sleep(1); } return 0; }
int main(void) { sigset_t s, p; sigemptyset(&s); sigaddset(&s, SIGINT); sigprocmask(SIG_BLOCK, &s, NULL); int n = 10; while(n--) { sigpending(&p); printsigset(&p); sleep(1); } sigemptyset(&s); sigdelset(&s, SIGINT); sigprocmask(SIG_UNBLOCK, &s, NULL); while(n--) { sigpending(&p); printsigset(&p); sleep(1); } return 0; }
int main(int argc, char *argv[]) { if (signal(SIGINT, handler) == SIG_ERR) ERR_EXIT("signal error"); if (signal(SIGQUIT, handler) == SIG_ERR) ERR_EXIT("signal error"); sigset_t pset; // 64bit sigset_t bset; sigemptyset(&bset); sigaddset(&bset, SIGINT); sigprocmask(SIG_BLOCK, &bset, NULL); for (; ;) { sigpending(&pset); printsigset(&pset); sleep(1); } return 0; }