⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linux环境进程间通信(二) 信号(下).htm

📁 关于Linux内核进程间通信的几篇文章
💻 HTM
📖 第 1 页 / 共 4 页
字号:
        <TR class=left-nav-child-highlight>
          <TD><IMG height=8 alt="" 
            src="Linux环境进程间通信(二) 信号(下).files/cl-bullet.gif" width=2></TD>
          <TD><A class=left-nav-child 
            href="http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index2.html#4">结束语:</A></TD></TR>
        <TR class=left-nav-child-highlight>
          <TD><IMG height=8 alt="" 
            src="Linux环境进程间通信(二) 信号(下).files/cl-bullet.gif" width=2></TD>
          <TD><A class=left-nav-child 
            href="http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index2.html#5">附录1:</A></TD></TR>
        <TR class=left-nav-child-highlight>
          <TD><IMG height=8 alt="" 
            src="Linux环境进程间通信(二) 信号(下).files/cl-bullet.gif" width=2></TD>
          <TD><A class=left-nav-child 
            href="http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index2.html#resources">参考资料 
            </A></TD></TR>
        <TR class=left-nav-child-highlight>
          <TD><IMG height=8 alt="" 
            src="Linux环境进程间通信(二) 信号(下).files/cl-bullet.gif" width=2></TD>
          <TD><A class=left-nav-child 
            href="http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index2.html#author">关于作者</A></TD></TR>
        <TR class=left-nav-child-highlight>
          <TD><IMG height=8 alt="" 
            src="Linux环境进程间通信(二) 信号(下).files/cl-bullet.gif" width=2></TD>
          <TD><A class=left-nav-child 
            href="http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index2.html#rate">对本文的评价</A></TD></TR>
        <TR class=left-nav-last>
          <TD width=14><IMG class=display-img height=1 alt="" 
            src="Linux环境进程间通信(二) 信号(下).files/c.gif" width=14></TD>
          <TD width=136><IMG class=display-img height=19 alt="" 
            src="Linux环境进程间通信(二) 信号(下).files/left-nav-corner.gif" 
        width=136></TD></TR></TBODY></TABLE><BR>
      <TABLE cellSpacing=0 cellPadding=0 width=150 border=0>
        <TBODY>
        <TR>
          <TD class=related colSpan=2><B class=related>相关链接:</B></TD></TR>
        <TR class=rlinks>
          <TD><IMG height=8 alt="" 
            src="Linux环境进程间通信(二) 信号(下).files/rl-bullet.gif" width=2></TD>
          <TD><A class=rlinks 
            href="http://www.ibm.com/developerworks/cn/views/linux/articles.jsp">Linux 
            技术文档库</A></TD></TR><!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- No content currently --><!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
        <TR>
          <TD width=14><IMG class=display-img height=1 alt="" 
            src="Linux环境进程间通信(二) 信号(下).files/c.gif" width=14></TD>
          <TD width=136><IMG class=display-img height=19 alt="" 
            src="Linux环境进程间通信(二) 信号(下).files/c.gif" 
      width=136></TD></TR></TBODY></TABLE><!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- No content currently --><!--END RESERVED FOR FUTURE USE INCLUDE FILES--></TD><!--LEFTNAV_END-->
    <TD width="100%">
      <TABLE id=content-table cellSpacing=0 cellPadding=0 width="100%" 
        border=0><TBODY>
        <TR vAlign=top>
          <TD width="100%">
            <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
              <TBODY>
              <TR>
                <TD><A name=main><IMG height=1 alt=跳转到主要内容 
                  src="Linux环境进程间通信(二) 信号(下).files/c.gif" width=592 
                border=0></A></TD></TR></TBODY></TABLE>
            <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
              <TBODY>
              <TR vAlign=top>
                <TD width=10 height=18><IMG height=18 alt="" 
                  src="Linux环境进程间通信(二) 信号(下).files/c.gif" width=10></TD>
                <TD width="100%"><IMG height=6 alt="" 
                  src="Linux环境进程间通信(二) 信号(下).files/c.gif" width=1><BR><A 
                  class=bctl 
                  href="http://www.ibm.com/developerworks/cn/">developerWorks 
                  中国</A><SPAN class=bct>&nbsp;&nbsp;&gt;&nbsp;&nbsp;</SPAN><A 
                  class=bctl 
                  href="http://www.ibm.com/developerworks/cn/linux/">Linux</A><SPAN 
                  class=bct>&nbsp;&nbsp;&gt;</SPAN><IMG height=1 alt="" 
                  src="Linux环境进程间通信(二) 信号(下).files/c.gif" width=1><BR>
                  <H1><SPAN style="COLOR: #999999">Linux环境进程间通信(二): 
                  </SPAN>信号(下)</H1><IMG class=display-img height=6 alt="" 
                  src="Linux环境进程间通信(二) 信号(下).files/c.gif" width=1></TD>
                <TD class=no-print width=192><IMG height=18 alt=developerWorks 
                  src="Linux环境进程间通信(二) 信号(下).files/dw.gif" 
              width=192></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
      <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
        <TBODY>
        <TR vAlign=top>
          <TD width=10><IMG height=1 alt="" 
            src="Linux环境进程间通信(二) 信号(下).files/c.gif" width=10></TD>
          <TD width="100%">
            <TABLE class=no-print cellSpacing=0 cellPadding=0 width=160 
            align=right border=0>
              <TBODY>
              <TR>
                <TD width=10><IMG height=1 alt="" 
                  src="Linux环境进程间通信(二) 信号(下).files/c.gif" width=10></TD>
                <TD>
                  <TABLE cellSpacing=0 cellPadding=0 width=150 border=0>
                    <TBODY>
                    <TR>
                      <TD class=v14-header-1-small>文档选项</TD></TR></TBODY></TABLE>
                  <TABLE class=v14-gray-table-border cellSpacing=0 cellPadding=0 
                  border=0>
                    <TBODY>
                    <TR>
                      <TD class=no-padding width=150>
                        <TABLE cellSpacing=0 cellPadding=0 width=143 
                          border=0><IMG height=1 alt="" 
                          src="Linux环境进程间通信(二) 信号(下).files/c.gif" width=8>
                          <FORM name=email 
                          action=https://www.ibm.com/developerworks/secure/email-it.jsp><INPUT 
                          type=hidden 
                          value=在信号(上)中,讨论了linux信号种类、来源、如何安装一个信号以及对信号集的操作。本部分则首先讨论从信号的生命周期上认识信号,或者宏观上看似简单的信号机制(进程收到信号后,作相应的处理,看上去再简单不过了),在微观上究竟是如何实现的,也是在更深层次上理解信号。接下来还讨论了信号编程的一些注意事项,最后给出了信号编程的一些实例。 
                          name=body><INPUT type=hidden 
                          value="Linux环境进程间通信(二): 信号(下)" name=subject><INPUT 
                          type=hidden value=cn name=lang>
                          <SCRIPT language=JavaScript type=text/javascript><!--document.write('<tr valign="top"><td width="8"><img src="//www.ibm.com/i/c.gif" width="8" height="1" alt=""/></td><td width="16"><img src="//www.ibm.com/i/v14/icons/em.gif" height="16" width="16" vspace="3" alt="将此页作为电子邮件发送" /></td><td width="122"><p><a class="smallplainlink" href="javascript:document.email.submit();"><b>将此页作为电子邮件发送</b></a></p></td></tr>');//--></SCRIPT>
                          <NOSCRIPT>
                          <TBODY>
                          <TR vAlign=top>
                            <TD width=8><IMG height=1 alt="" 
                              src="Linux环境进程间通信(二) 信号(下).files/c.gif" 
width=8></TD>
                            <TD width=16><IMG height=16 alt="" 
                              src="Linux环境进程间通信(二) 信号(下).files/c.gif" 
                            width=16></TD>
                            <TD class=small width=122>
                              <P><SPAN class=ast>未显示需要 JavaScript 
                              的文档选项</SPAN></P></TD></TR></NOSCRIPT></FORM></TBODY></TABLE></TD></TR></TBODY></TABLE><!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- this content will be automatically generated across all content areas --><BR><!--END RESERVED FOR FUTURE USE INCLUDE FILES--><BR></TD></TR></TBODY></TABLE>
            <P>级别: 初级</P>
            <P><A 
            href="http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index2.html#author">郑彦兴</A> 
            (<A 
            href="mailto:mlinux@163.com?subject=信号(下)">mailto:mlinux@163.com?subject=信号(下)</A>)国防科大<BR></P>
            <P>2003 年 1 月 01 日</P>
            <BLOCKQUOTE>在信号(上)中,讨论了linux信号种类、来源、如何安装一个信号以及对信号集的操作。本部分则首先讨论从信号的生命周期上认识信号,或者宏观上看似简单的信号机制(进程收到信号后,作相应的处理,看上去再简单不过了),在微观上究竟是如何实现的,也是在更深层次上理解信号。接下来还讨论了信号编程的一些注意事项,最后给出了信号编程的一些实例。</BLOCKQUOTE><!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
            <P><A name=1><SPAN class=atitle>一、信号生命周期</SPAN></A></P>
            <P>从信号发送到信号处理函数的执行完毕</P>
            <P>对于一个完整的信号生命周期(从信号发送到相应的处理函数执行完毕)来说,可以分为三个重要的阶段,这三个阶段由四个重要事件来刻画:信号诞生;信号在进程中注册完毕;信号在进程中的注销完毕;信号处理函数执行完毕。相邻两个事件的时间间隔构成信号生命周期的一个阶段。</P><BR><IMG 
            height=34 alt="" src="Linux环境进程间通信(二) 信号(下).files/3.gif" width=594> 
            <BR>
            <P>下面阐述四个事件的实际意义:</P>
            <OL>
              <LI>信号"诞生"。信号的诞生指的是触发信号的事件发生(如检测到硬件异常、定时器超时以及调用信号发送函数kill()或sigqueue()等)。 

              <LI>信号在目标进程中"注册";进程的task_struct结构中有关于本进程中未决信号的数据成员: 
              <TABLE cellSpacing=0 cellPadding=0 width=500 border=0>
                <TBODY>
                <TR>
                  <TD class=code-outline><PRE class=displaycode>struct sigpending pending:
struct sigpending{
	struct sigqueue *head, **tail;
	sigset_t signal;
};
</PRE></TD></TR></TBODY></TABLE><BR>第三个成员是进程中所有未决信号集,第一、第二个成员分别指向一个sigqueue类型的结构链(称之为"未决信号信息链")的首尾,信息链中的每个sigqueue结构刻画一个特定信号所携带的信息,并指向下一个sigqueue结构: 

              <TABLE cellSpacing=0 cellPadding=0 width=500 border=0>
                <TBODY>
                <TR>
                  <TD class=code-outline><PRE class=displaycode>struct sigqueue{
	struct sigqueue *next;
	siginfo_t info;
}
</PRE></TD></TR></TBODY></TABLE><BR>信号在进程中注册指的就是信号值加入到进程的未决信号集中(sigpending结构的第二个成员sigset_t 
              signal),并且信号所携带的信息被保留到未决信号信息链的某个sigqueue结构中。只要信号在进程的未决信号集中,表明进程已经知道这些信号的存在,但还没来得及处理,或者该信号被进程阻塞。 

              <P><B>注:</B> 
              <BR>当一个实时信号发送给一个进程时,不管该信号是否已经在进程中注册,都会被再注册一次,因此,信号不会丢失,因此,实时信号又叫做"可靠信号"。这意味着同一个实时信号可以在同一个进程的未决信号信息链中占有多个sigqueue结构(进程每收到一个实时信号,都会为它分配一个结构来登记该信号信息,并把该结构添加在未决信号链尾,即所有诞生的实时信号都会在目标进程中注册); 
              <BR>当一个非实时信号发送给一个进程时,如果该信号已经在进程中注册,则该信号将被丢弃,造成信号丢失。因此,非实时信号又叫做"不可靠信号"。这意味着同一个非实时信号在进程的未决信号信息链中,至多占有一个sigqueue结构(一个非实时信号诞生后,(1)、如果发现相同的信号已经在目标结构中注册,则不再注册,对于进程来说,相当于不知道本次信号发生,信号丢失;(2)、如果进程的未决信号中没有相同信号,则在进程中注册自己)。 
              </P>
              <LI>信号在进程中的注销。在目标进程执行过程中,会检测是否有信号等待处理(每次从系统空间返回到用户空间时都做这样的检查)。如果存在未决信号等待处理且该信号没有被进程阻塞,则在运行相应的信号处理函数前,进程会把信号在未决信号链中占有的结构卸掉。是否将信号从进程未决信号集中删除对于实时与非实时信号是不同的。对于非实时信号来说,由于在未决信号信息链中最多只占用一个sigqueue结构,因此该结构被释放后,应该把信号在进程未决信号集中删除(信号注销完毕);而对于实时信号来说,可能在未决信号信息链中占用多个sigqueue结构,因此应该针对占用sigqueue结构的数目区别对待:如果只占用一个sigqueue结构(进程只收到该信号一次),则应该把信号在进程的未决信号集中删除(信号注销完毕)。否则,不应该在进程的未决信号集中删除该信号(信号注销完毕)。 
              <BR>进程在执行信号相应处理函数之前,首先要把信号在进程中注销。 
              <LI>信号生命终止。进程注销信号后,立即执行相应的信号处理函数,执行完毕后,信号的本次发送对进程的影响彻底结束。 
              <P><B>注:</B> 
              <BR>1)信号注册与否,与发送信号的函数(如kill()或sigqueue()等)以及信号安装函数(signal()及sigaction())无关,只与信号值有关(信号值小于SIGRTMIN的信号最多只注册一次,信号值在SIGRTMIN及SIGRTMAX之间的信号,只要被进程接收到就被注册)。 
              <BR>2)在信号被注销到相应的信号处理函数执行完毕这段时间内,如果进程又收到同一信号多次,则对实时信号来说,每一次都会在进程中注册;而对于非实时信号来说,无论收到多少次信号,都会视为只收到一个信号,只在进程中注册一次。 
              </P></LI></OL><BR>
            <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
              <TBODY>
              <TR>
                <TD><IMG height=1 alt="" 
                  src="Linux环境进程间通信(二) 信号(下).files/blue_rule.gif" 
                  width="100%"><BR><IMG height=6 alt="" 
                  src="Linux环境进程间通信(二) 信号(下).files/c.gif" width=8 
              border=0></TD></TR></TBODY></TABLE>
            <TABLE class=no-print cellSpacing=0 cellPadding=0 align=right>
              <TBODY>
              <TR align=right>
                <TD><IMG height=4 alt="" 
                  src="Linux环境进程间通信(二) 信号(下).files/c.gif" width="100%"><BR>
                  <TABLE cellSpacing=0 cellPadding=0 border=0>
                    <TBODY>
                    <TR>
                      <TD vAlign=center><IMG height=16 alt="" 
                        src="Linux环境进程间通信(二) 信号(下).files/u_bold.gif" width=16 
                        border=0><BR></TD>
                      <TD vAlign=top align=right><A class=fbox 
                        href="http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index2.html#main"><B>回页首</B></A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR><BR>
            <P><A name=2><SPAN class=atitle>二、信号编程注意事项</SPAN></A></P>
            <OL>
              <LI>防止不该丢失的信号丢失。如果对八中所提到的信号生命周期理解深刻的话,很容易知道信号会不会丢失,以及在哪里丢失。 
              <LI><B>程序的可移植性</B> <BR>考虑到程序的可移植性,应该尽量采用POSIX信号函数,POSIX信号函数主要分为两类: 

              <UL>
                <LI>POSIX 1003.1信号函数: 
                Kill()、sigaction()、sigaddset()、sigdelset()、sigemptyset()、sigfillset()、sigismember()、sigpending()、sigprocmask()、sigsuspend()。 

                <LI>POSIX 1003.1b信号函数。POSIX 1003.1b在信号的实时性方面对POSIX 
                1003.1做了扩展,包括以下三个函数: 
                sigqueue()、sigtimedwait()、sigwaitinfo()。其中,sigqueue主要针对信号发送,而sigtimedwait及sigwaitinfo()主要用于取代sigsuspend()函数,后面有相应实例。 

                <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
                  <TBODY>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -