- 论坛徽章:
- 0
|
在Linux编程中遇到一个问题:在使用sigaction进行信号处理的时候,最后的write好像没有被执行,代码如下:- /*
- * test the sigaction's sa_mask member
- * */
- #include "apue.h"
- void
- signal_handle(int signo)
- {
- if(signo == SIGUSR1)
- {
- printf("get signo [SIGUSR1]\n");
- sleep(1);
- }
- else if(signo == SIGUSR2)
- {
- printf("get signo [SIGUSR2]\n");
- sleep(1);
- }
- }
- int
- main(void)
- {
- pid_t pid;
- sigset_t set;
- struct sigaction sigac1, sigac2;
- /*sigaction(SIGUSR1, NULL, &sigac1);
- sigaction(SIGUSR2, NULL, &sigac2);*/
- sigfillset(&set);
- sigdelset(&set, SIGUSR1);
- sigdelset(&set, SIGUSR2);
- sigprocmask(SIG_SETMASK, &set, NULL);
- sigac1.sa_handler = signal_handle;
- sigac2.sa_handler = signal_handle;
- /*sigac1.sa_flags |= SA_RESTART;
- sigac2.sa_flags |= SA_RESTART;*/
- sigfillset(&sigac1.sa_mask);
- sigdelset(&sigac1.sa_mask, SIGUSR1);
- sigfillset(&sigac2.sa_mask);
- sigdelset(&sigac2.sa_mask, SIGUSR2);
- if(sigaction(SIGUSR2, &sigac2, NULL) < 0)
- _err("register signal error");
- if(sigaction(SIGUSR1, &sigac1, NULL) < 0)
- _err("register signal error");
- if((pid = fork()) > 0)
- {
- sleep(1);
- kill(pid, SIGUSR1);
- kill(pid, SIGUSR2);
- wait(NULL);
- }
- else
- {
- sleep(1);
- write(STDOUT_FILENO, "hello\n", 6);
- }
- return 0;
- }
复制代码 最后的write系统调用没有在终端中输出,不知道是不是系统调用被信号中断了,然后没有重启。但是我使用了如下方式调用sigaction又可以了:- sigaction(SIGUSR1, NULL, &sigac1);
- sigaction(SIGUSR2, NULL, &sigac2);
复制代码 或者使用signal处理信号也可以正常工作。是不是和sigaction中的某写SA_XXXX选项有关? |
|