温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

sigsuspend函数有什么用

发布时间:2021-09-22 17:19:59 来源:亿速云 阅读:177 作者:小新 栏目:开发技术

这篇文章将为大家详细讲解有关sigsuspend函数有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

  sigsuspend函数作用:如果在等待信号发生时希望去休眠,则使用sigsuspend函数是非常合适的。

  sigsuspend函数示例

  头文件:#include<signal.h>

  一个保护临界区代码的错误实例:(sigprocmask()和pause()实现)

  #include<unistd.h>

  #include<signal.h>

  #include<stdio.h>

  voidhandler(intsig)//信号处理函数的实现

  {

  printf("SIGINTsig");

  }

  intmain()

  {

  sigset_tnew,old;

  structsigactionact;

  act.sa_handler=handler;//信号处理函数handler

  sigemptyset(&act.sa_mask);

  act.sa_flags=0;

  sigaction(SIGINT,&act,0);//准备捕捉SIGINT信号

  sigemptyset(&new);

  sigaddset(&new,SIGINT);

  sigprocmask(SIG_BLOCK,&new,&old);//将SIGINT信号阻塞,同时保存当前信号集

  printf("Blocked");

  sigprocmask(SIG_SETMASK,&old,NULL);//取消阻塞

  pause();

  return0;

  }

  上面实例的问题是:本来期望pause()之后,来SIGINT信号,可以结束程序;可是,如果当“取消阻塞”和“pause”之间,正好来了SIGINT信号,结果程序因为pause的原因会一直挂起。。

  sigsuspend函数问题解决

  如果在信号阻塞时将其发送给进程,那么该信号的传递就被推迟直到对它解除了阻塞。对应用程序而言,该信号好像发生在解除对SIGINT的阻塞和pause之间。如果发生了这种情况,或者如果在解除阻塞时刻和pause之间确实发生了信号,那么就产生了问题。因为我们可能不会再见到该信号,所以从这种意义上而言,在此时间窗口(解除阻塞和pause之间)中发生的信号丢失了,这样就使pause永远阻塞。

  为了纠正此问题,需要在一个原子操作中先恢复信号屏蔽字,然后使进程休眠。这种功能是由sigsuspend函数提供的。

  #include<signal.h>

  intsigsuspend(constsigset_t*sigmask);

  返回值:-1,并将errno设置为EINTR

  将进程的信号屏蔽字设置为由sigmask指向的值。在捕捉到一个信号或发生了一个会终止该进程的信号之前,该进程被挂起。如果捕捉到一个信号而且从该信号处理程序返回,则sigsuspend返回,并且将该进程的信号屏蔽字设置为调用sigsuspend之前的值。

  注意,此函数没有成功返回值。如果它返回到调用者,则总是返回-1,并将errno设置为EINTR(表示一个被中断的系统调用)。

关于“sigsuspend函数有什么用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI