- 论坛徽章:
- 4
|
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <signal.h>
- #define pr_mask printf
- #define err_sys printf
- int n = 0;
- static void sig_int(int);
- int main(void)
- {
- sigset_t newmask, oldmask, waitmask;
- pr_mask("program start: \n");
- //1, 锁信号(阻塞SIGINT, SIGUSR1)
- sigemptyset(&waitmask);
- sigaddset(&waitmask, SIGUSR1);
- sigemptyset(&newmask);
- sigaddset(&newmask, SIGINT);
- if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
- err_sys("SIG_BLOCK error");
- //2, 注册处理函数. (1与2最好保持顺序, 以免在注册后立即到来信号丢失事件)
- if (signal(SIGINT, sig_int) == SIG_ERR)
- err_sys("signal(SIGINT) error");
- pr_mask("in critical region: \n");
- //3, 这里用错了, 用oldmask释放掉SIGINT,SIGUSR1的阻塞
- //给你看看真正的安全信号编程是怎么回事
- while (!n) { //此处已被锁保护, 检查变量
- sigsuspend(&oldmask); //条件不满足, 原子释放锁+挂起
- }
- //条件满足, 安全打印n
- pr_mask("after return from sigsuspend: %d\n", n);
- //4, 释放掉信号锁
- sigprocmask(SIG_SETMASK, &oldmask, NULL);
- //5, 此后操作n是不安全的.
- pr_mask("program exit: \n");
- exit(0);
- }
- static void sig_int(int signo)
- {
- n = 1;
- pr_mask("\nin sig_int: \n");
- }
复制代码 楼主好好吸收一下吧, 对你掌握后面的条件变量也有好处. |
|