可靠信号术语和语义-数据流图到模块结构图的直接转换方法

时间:2024-07-12 01:23:46
【文件属性】:

文件名称:可靠信号术语和语义-数据流图到模块结构图的直接转换方法

文件大小:5.82MB

文件格式:PDF

更新时间:2024-07-12 01:23:46

APUE UNIX

10.8 可靠信号术语和语义 我们需要定义一些在讨论信号时会用到的术语。首先,当造成信号的事件发生时,为进程 产生一个信号(或向一个进程发送一个信号)。事件可以是硬件异常(例如除以 0)、软件条件 (例如,闹钟时间超过)、终端产生的信号或调用 k i l l函数。在产生了信号时,内核通常在进程 表中设置某种形式的一个标志。当对信号做了这种动作时,我们说向一个进程递送了一个信号。 在信号产生(g e n e r a t i o n)和递送(d e l i v e r y)之间的时间间隔内,称信号未决(p e n d i n g)。 进程可以选用“信号递送阻塞”。如果为进程产生了一个选择为阻塞的信号,而且对该信 号的动作是系统默认动作或捕捉该信号,则为该进程将此信号保持为未决状态,直到该进程 ( a )对此信号解除了阻塞,或者 ( b )将对此信号的动作更改为忽略。当递送一个原来被阻塞的信 号给进程时,而不是在产生该信号时,内核才决定对它的处理方式。于是进程在信号递送给 它之前仍可改变对它的动作。进程调用 s i g p e n d i n g函数(见1 0 . 1 3节)将指定的信号设置为阻塞 和未决。 如果在进程解除对某个信号的阻塞之前,这种信号发生了多次,那么将如何呢 ? P O S I X . 1允 许系统递送该信号一次或多次。如果递送该信号多次,则称这些信号排了队。但是大多数 U N I X并不对信号排队。代之以,U N I X内核只递送这种信号一次。 系统V早期版本的手册页称S I G C L D信号是用排队方式处理的,但实际并非如 此。代之以,内核按 1 0 . 7节中所述方式产生此信号。 AT & T〔1 9 9 0 e〕的 s i g a c t i o n ( 2 )手册页称S A - S I G I N F O标志(见表1 0 - 5)使信号可靠地排队,这也不正 确。表面上此功能存在于内核中,但在S V R 4中并不起作用。 如果有多个信号要递送给一个进程,那么将如何呢 ? P O S I X . 1并没有规定这些信号的递送顺 序。但是P O S I X . 1建议:与进程当前状态有关的信号,例如S I G S E G V在其他信号之前递送。 每个进程都有一个信号屏蔽字,它规定了当前要阻塞递送到该进程的信号集。对于每种 可能的信号,该屏蔽字中都有一位与之对应。对于某种信号,若其对应位已设置,则它当 前是被阻塞的。进程可以调用 s i g p r o c m a s k(在1 0 . 1 2节中说明)来检测和更改其当前信号屏 蔽字。 信号数可能会超过一个整型数所包含的二进制位数,因此 P O S I X . 1定义了一个新数据类型 s i g s e t _ t,它保持一个信号集。例如,信号屏蔽字就保存在这些信号集的一个中。 1 0 . 11节将说 明对信号集进行操作的五个函数。 10.9 kill和r a i s e函数 k i l l函数将信号发送给进程或进程组。 r a i s e函数则允许进程向自身发送信号。 r a i s e是由ANSI C而非P O S I X . 1定义的。因为ANSI C并不涉及多进程,所以它 不能定义如k i l l这样要有一个进程I D作为其参数的函数。 #include #include int kill(pid_t p i d, int s i g n o) ; 第 1 0章 信 号 2 1 3


网友评论