在网上看了好多关于这两个系统调用的解释,但是一直没完全弄明白两者之间的区别。于是自己沉下心,仔细研究了下,并结合网友的帖子总结两者的区别。希望对大家有用。本人也是初学者,可能理解有误,仅作参考。
sigsuspend()和pause()都可用于使程序挂起休眠,但是在某些场合下,两者会产生不同的效果。
应用场景:需要先阻塞某个信号,然后解除阻塞等待该信号并捕获执行相关操作。
这种场景可以使用sigsuspend() 或这 sigprocmask()+pause() 完成,但是他们之间是有区别的。为了便于理解直接用图解法,直观、简洁。上图咯:
以上两种方式,
相比pause() ,sigsuspend()不会有信号丢失的情况。因为它把 sigprocmask()+pause() 合并为一个原子操作,不会像
sigprocmask()+pause()存在函数切换的窗口时间。所以在如上的应用场景下推荐使用sigsuspend().
sigsuspend()的整个原子操作过程为:
(1) 设置新的mask阻塞当前进程;
(2) 收到信号,恢复原先mask;
(3) 调用该进程设置的信号处理函数;
(4) 待信号处理函数返回后,sigsuspend返回。
|
代码如下:(运行结果自行测试)
-
/**此代码来自网上**/
-
#include <stdio.h>
-
#include <signal.h>
-
#include <unistd.h>
-
#include <string.h>
-
-
void func(int num)
-
{
-
printf("0\n");
-
}
-
-
int main(void)
-
{
-
int i;
-
sigset_t set;
-
sigset_t empty;
-
-
sigemptyset(&set);
-
sigemptyset(&empty);
-
sigaddset(&set, SIGINT);
-
signal(SIGINT, func);
-
-
while(1)
-
{
-
sigprocmask(SIG_BLOCK, &set, NULL);
-
for(i = 0; i < 5 ; i++)
-
{
-
write(1, "* ", strlen("* "));
-
sleep(1);
-
}
-
printf("\n");
-
#if 1
-
sigsuspend(&empty);
-
#else
-
sigprocmask(SIG_UNBLOCK, &set, NULL);
-
pause();
-
#endif
-
}
-
-
return 0;
-
}
阅读(6606) | 评论(0) | 转发(1) |