信号--sigpending函数
来源:互联网 发布:淘宝信用等级怎么刷 编辑:程序博客网 时间:2024/06/09 17:11
信号--sigpending函数
进程阻塞了SIGQUIT,保存它当前的信号掩码(以便稍后重置),然后睡眠5秒。在此期间的任何退出信号的发生都不会被分发,直到信号被反阻塞。在5秒的睡眠后,我们检查信号是否待定并反阻塞这个信号。
sigpending函数返回被阻塞而为调用进程待定的信号。信号集通过set参数返回。
- #include <signal.h>
- int sigpending(sigset_t *set);
- 成功返回0,错误返回-1
下面的代码展示了我们描述过的所有信号的特性。
- #include <signal.h>
- static void sig_quit(int);
- int
- main(void)
- {
- sigset_t newmask, oldmask, pendmask;
- if (signal(SIGQUIT, sig_quit) == SIG_ERR) {
- printf("can't catch SIGQUIT");
- exit(1);
- }
- /*
- * Block SIGQUIT and save current signal mask.
- */
- sigemptyset(&newmask);
- sigaddset(&newmask, SIGQUIT);
- if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0) {
- printf("SIG_BLOCK error\n");
- exit(1);
- }
- sleep(5); /* SIGQUIT here will remain pending */
- if (sigpending(&pendmask) < 0) {
- printf("sigpending error\n");
- exit(1);
- }
- if (sigismember(&pendmask, SIGQUIT))
- printf("\nSIGQUIT pending\n");
- /*
- * Reset signal mask which unblocks SIGQUIT.
- */
- if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0) {
- printf("SIG_SETMASK error\n");
- exit(1);
- }
- printf("SIGQUIT unblocked\n");
- sleep(5); /* SIGQUIT here will terminate with core file */
- exit(0);
- }
- static void
- sig_quit(int signo)
- {
- printf("caught SIGQUIT\n");
- if (signal(SIGQUIT, SIG_DFL) == SIG_ERR) {
- printf("can't reset SIGQUIT\n");
- exit(1);
- }
- }
进程阻塞了SIGQUIT,保存它当前的信号掩码(以便稍后重置),然后睡眠5秒。在此期间的任何退出信号的发生都不会被分发,直到信号被反阻塞。在5秒的睡眠后,我们检查信号是否待定并反阻塞这个信号。
注 意我们在阻塞信号前保存了老的掩码。为了反阻塞信号,我们执行了老掩码的SIG_SETMASK。另一种方式,我们可以只SIG_UNBLOCK我们已经 阻塞的信号。然而,要知道如果我们写了一个可以被其他调用的函数,且我们需要在我们的函数里阻塞一个信号,那么我们不能使用SIG_UNBLOCK来反阻 塞这个信号。在这种情况下,我们必须使用SIG_SETMASK并把信号掩码重置为它之前的值,因为调用者在调用我们的函数前可能已经阻塞了这个信号。我 们将在10.18节里的system函数里看到一个这样的例子。
如果我们在睡眠期产生退出信号,那么信号现在是待定而无阻塞的,所以它在sigprocmask返回值被分发。我们将看到这个发生因为信号处理器里的printf在sigprocmask调用后面的printf之前输出。
进程然后又睡了5秒。如果我们在这个睡眠期间产生了退出信号,那么信号应该终止这个进程,因为我们在捕获到它后把这个信号重置到默认值。在下面的输出里,当我们输入终端退出符Control-backslash时终端打印出^\:
$ ./a.out
^\
SIGQUIT pending
caught SIGQUIT
SIGQUIT unblocked
$ ./a.out
^\^\^\^\^\^\^\^\^\^\
SIGQUIT pending
caught SIGQUIT
SIGQUIT unblocked
注意第二次运行程序时我们在进程睡眠时产生了十倍的退出信号,但是信号在被反阻塞后只被分发给了进程一次。这证明了信号没有在这个系统上排队。
0 0
- 信号--sigpending函数
- linux信号(sigprocmask,sigpending)
- sigprocmask , sigpending 和 sigsuspend函数
- 2信号处理之:信号产生原因,进程处理信号行为,信号集处理函数,PCB的信号集,sigprocmask()和sigpending(),信号捕捉设定,sigaction,C标准库信号处理函数,可重入函数,
- sigpending显示当前进程有哪个信号被pending
- Linux信号控制-sigprocmask,sigsuspend,sigpending,sigaction,sigqueue
- 利用sigpending,sigismember检测信号是否被挂起
- C语言学习:信号屏蔽字sigset_t,sigprocmask,sigpending
- linux学习---信号(signal,sigaction,kill,sigqueue,sigprocmask,sigpending,sigsuspend)
- 【Unix环境高级编程】sigprocmask函数与sigpending函数
- 调用信号处理程序被捕捉的信号自动地加到进程的当前信号屏蔽字中signal() sigpending()
- GTK+ 2.0 教程--深入探索信号处理函数
- 第十章*信号(十九)--sleep函数
- 信号函数
- 信号函数
- sigpending()--Examine Pending Signals
- Linux进程-信号
- LINUX-信号SIGNAL
- 装载问题
- GitHub Top 50 简介 和iOS相关资料总结
- <LeetCode><Easy> 169 Majority Element
- Android教程 -04 启动其它Activity,静态工厂设计模式传递数据
- CFileDialog的用法简介
- 信号--sigpending函数
- iBATIS - Hibernate
- log4j 使用和配置
- 安卓访问网络常用的3种方式(httpClient, httpUrlConnection,android-query ajax)及cookie处理
- java 设计模式简单解析
- 王健林=马云+2个刘强东—《2015胡润百富榜》
- 网站收藏
- Unity 3d脚本加密方案
- LeetCode 刷题4 -- 删除单链表的节点