sigaction实现信号捕捉
1. #include <signal.h> 2. 3. int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
struct sigaction 定义:
1. struct sigaction { 2. 3. void (*sa_handler)(int); 4. 5. void (*sa_sigaction)(int, siginfo_t *, void *); 6. 7. sigset_t sa_mask; 8. 9. int sa_flags; 10. 11. void (*sa_restorer)(void); 12. 13. };
sa_handler : 早期的捕捉函数
sa_sigaction : 新添加的捕捉函数,可以传参 , 和sa_handler互斥,两者通过sa_flags选择采用哪种捕捉函数。sa_handler和sa_sigaction只能使用一个
sa_mask : 在执行捕捉函数时,设置阻塞其它信号,sa_mask | 进程阻塞信号集,退出捕捉函数后,还原回原有的阻塞信号集
sa_flags : SA_SIGINFO 或者 0
sa_restorer : 保留,已过时
程序:程序一直在标准输入中读取字符,直到SIGUSR1和SIGUSR2注册处理函数打断
注:前32个经典Unix信号中,处理SIGUSR1和SIGUSR2未给出明确定义(也就是说用户可以自定义这两个信号),其余信号均有明确定义
1. #include <stdio.h> 2. #include <unistd.h> 3. #include <signal.h> 4. #include <errno.h> 5. 6. static void sig_usr(int signum) 7. { 8. if(signum == SIGUSR1) 9. { 10. printf("SIGUSR1 received\n"); 11. } 12. else if(signum == SIGUSR2) 13. { 14. printf("SIGUSR2 received\n"); 15. } 16. else 17. { 18. printf("signal %d received\n", signum); 19. } 20. } 21. 22. int main(void) 23. { 24. char buf[512]; 25. int n; 26. struct sigaction sa_usr; 27. sa_usr.sa_flags = 0; 28. sa_usr.sa_handler = sig_usr; //信号处理函数 29. 30. sigaction(SIGUSR1, &sa_usr, NULL); 31. sigaction(SIGUSR2, &sa_usr, NULL); 32. 33. printf("My PID is %d\n", getpid()); 34. 35. while(1) 36. { 37. if((n = read(STDIN_FILENO, buf, 511)) == -1) 38. { 39. if(errno == EINTR) 40. { 41. printf("read is interrupted by signal\n"); 42. } 43. } 44. else 45. { 46. buf[n] = '\0'; 47. printf("%d bytes read: %s\n", n, buf); 48. } 49. } 50. 51. return 0; 52. }
执行结果如下: