当前位置:  技术问答>linux和unix

s信号处理时,为什么信号动作要复位。

    来源: 互联网  发布时间:2017-05-28

    本文导语:  APUE:在旧版本中进程每次接到信号对其进行处理时,随即该信号动作复位为默认值。 不过我写了几行代码: #include #include #include void sig_usr(int signo){ printf("get a signaln"); } int main(){ if(signal(SIGUSR1,sig_usr)==SIG_ERR){ p...

APUE:在旧版本中进程每次接到信号对其进行处理时,随即该信号动作复位为默认值。
不过我写了几行代码:
#include
#include
#include

void sig_usr(int signo){
printf("get a signaln");
}

int main(){
if(signal(SIGUSR1,sig_usr)==SIG_ERR){
printf("cath sig usr failedn");
}
for(;;)
pause();
}

结果不会出现这种情况,不再次安装处理函数,可以一直接受到sigusr1信号。
话说,旧版系统为什么会有那么奇怪的处理方式呢?处理函数一直保留不是挺好的吗。

|
多线程处理的碰到过一次,然后我改成sigaction了,不过是aix~~

|
可能就是实现者的意思吧

|
gcc -ansi 编译就可以啦
也可以用哦
gcc -D-D_XOPEN_SOURCE 编译

   Portability
       The only portable use of signal() is to set a signal’s disposition to SIG_DFL or SIG_IGN.  The  semantics  when
       using  signal()  to  establish a signal handler vary across systems (and POSIX.1 explicitly permits this varia-
       tion); do not use it for this purpose.

       POSIX.1 solved the portability mess by specifying sigaction(2), which provides explicit control of  the  seman-
       tics when a signal handler is invoked; use that interface instead of signal().

       In the original Unix systems, when a handler that was established using signal() was invoked by the delivery of
       a signal, the disposition of the signal would be reset to SIG_DFL, and the system did  not  block  delivery  of
       further  instances  of  the signal.  System V also provides these semantics for signal().  This was bad because
       the signal might be delivered again before the handler had a chance to reestablish itself.  Furthermore,  rapid
       deliveries of the same signal could result in recursive invocations of the handler.

       BSD  improved  on  this  situation  by  changing the semantics of signal handling (but, unfortunately, silently
       changed the semantics when establishing a handler with signal()).  On BSD, when a signal  handler  is  invoked,
       the signal disposition is not reset, and further instances of the signal are blocked from being delivered while
       the handler is executing.

       The situation on Linux is as follows:

       * The kernel’s signal() system call provides System V semantics.

       * By default, in glibc 2 and later, the signal() wrapper function does  not  invoke  the  kernel  system  call.
         Instead,  it  calls sigaction(2) using flags that supply BSD semantics.  This default behavior is provided as
         long as the _BSD_SOURCE feature test macro is defined.  By  default,  _BSD_SOURCE  is  defined;  it  is  also
         implicitly defined if one defines _GNU_SOURCE, and can of course be explicitly defined.

         On  glibc  2 and later, if the _BSD_SOURCE feature test macro is not defined, then signal() provides System V
         semantics.  (The default implicit definition of _BSD_SOURCE is not provided if one invokes gcc(1) in  one  of
         its  standard  modes  (-std=xxx or -ansi) or defines various other feature test macros such as _POSIX_SOURCE,
         _XOPEN_SOURCE, or _SVID_SOURCE; see feature_test_macros(7).)

       * The signal() function in Linux libc4 and libc5 provide System V semantics.  If one on a libc5 system includes
          instead of , then signal() provides BSD semantics.

    
 
 

您可能感兴趣的文章:

  • 进入信号处理函数,是不是会自动把进入信号加入信号屏蔽字?还有sigpending
  • 信号处理函数里面用CRT函数可能导致"信号触发-处理"死循环吗?
  • 在执行信号处理程序来一个信号会怎么样?
  • 请高手指教 linux 信号处理问题
  • 关于linux内核中信号处理的问题?(信号处理的时间)
  • linux的信号处理函数中如何访问共享资源
  • 一个关于信号处理的问题
  • 信号处理中的SIGBUS
  • *** 求助!!! 关于(可靠)信号处理的问题 ***
  • 地震信号处理工具包 Seismic ToolKit
  • Linux,aix,windows下可以查询非本进程的信号处理函数吗?
  • 一段关于信号处理的代码看不懂?
  • 请教:多线程模式下的信号处理问题
  • 命名管道是不是一定要配合信号处理
  • linux信号处理程序
  • posix信号处理的一个问题
  • linux 信号及信号处理
  • linux编程中简单的信号处理问题,请教各位,谢谢。
  • 进程处理信号都不陌生,但线程处理信号……,进者有分
  • C++信号处理库 SP++
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 为何信号处理没有及时被处理呢?
  • c++中怎么写sigaction()中的信号处理函数
  • 关于系统信号处理函数signal()的疑问.
  • 对信号处理函数的迷惑!
  • 数字信号处理算法 Feldspar
  • linux下类的成员函数不可以作为自定义的信号处理函数么?
  • 一个幼稚的信号处理问题
  • 数学、信号处理、通讯类C++库 IT++
  • linux信号处理问题SIGPIPE
  • 为什么作了信号处理之后select函数就不能正常工作了?
  • HP-UX移植到RedHat Linux过程中的多线程和信号处理
  • 一个信号处理的问题,急
  • QWebView loadFinished 信号处理页面显示问题
  • 求助:linux信号处理的默认函数宏定义怎么理解呢?
  • linux 下多线程 每个线程能否使用alarm来处理,信号是否会乱呢?
  • 请教信号量处理函数signal的问题?
  • 关于信号处理问题:
  • 多线程对信号的处理
  • 关于Linux下信号处理的一个问题,请大家帮忙看看!
  • 不知道该怎样处理信号?请指教啊!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3