电子产业一站式赋能平台

PCB联盟网

搜索
查看: 297|回复: 0
收起左侧

嵌入式Linux:信号分类

[复制链接]

1002

主题

1002

帖子

8862

积分

高级会员

Rank: 5Rank: 5

积分
8862
发表于 2024-8-19 12:01:00 | 显示全部楼层 |阅读模式

hxl4strddkl6405875410.gif

hxl4strddkl6405875410.gif
6 M, n2 m5 f4 G0 m: w+ L. t
点击上方蓝色字体,关注我们) P4 i1 m# y: z5 W$ ]5 h
" ]* I! K& z2 d# \; N
图中,信号编号在1到31之间的信号被定义为不可靠信号(非实时信号)。这些信号主要继承自早期的UNIX系统,使用了最初设计的简单信号机制。在这种机制中,如果一个信号在进程处理另一个相同信号时到达,该信号可能会被丢失,从而导致进程错过某些事件。信号编号在34到64之间的信号被定义为可靠信号(实时信号)。与不可靠信号不同,可靠信号支持排队处理,即使多个相同信号在处理过程中到达,它们也不会被丢失,而是按照到达顺序依次处理。
) ~3 c7 t! W  P( P, O+ O
1 _6 I, o7 m: F$ o( s值得注意的是,可靠信号(实时信号)并没有像不可靠信号那样的具体名称,而是采用了相对编号的方式来表示。这些信号使用SIGRTMIN+N或SIGRTMAX-N的形式进行表示,其中:
. j- ^. r9 W1 G
  • SIGRTMIN是可靠信号(实时信号)的最小编号,通常为34。
  • SIGRTMAX是可靠信号(实时信号)的最大编号,通常为64。
    : Y3 h9 M8 [: F& O

    6 J% i: r; M1 W1 {3 t# I$ @因此,SIGRTMIN+1代表编号为35的可靠信号(实时信号),SIGRTMAX-1代表编号为63的可靠信号(实时信号)" W# m; [' S6 `! C
    1
    6 z. O% o" M; n& j3 c% H不可靠信号与可靠信号, C& e# h6 `  x5 `+ G
    1.1、不可靠信号* }6 i: t( r5 c
    早期UNIX系统中的信号机制被称为不可靠信号,Linux的信号机制基本上继承自早期UNIX系统。所以信号机制设计相对简单,虽然实现了基本的进程间通信功能,但在实际应用中暴露出一些显著问题。
    " P) S0 g9 J, O6 m
    ) y6 n- \1 u/ W7 Y其主要问题包括:
    ( a& [! t' x! d2 C+ F
  • 信号处理后恢复默认行为4 Z* Z* f; A  z* c) e( g$ w
            在早期的UNIX中,进程每次处理完信号后,系统会自动将该信号的处理方式恢复为默认操作。: Q# P3 c" m. G# \4 }9 O! V
    这意味着,如果用户希望持续使用自定义的信号处理函数,就需要在信号处理函数的末尾再次调用signal()函数重新绑定处理函数。+ H  T9 D3 `+ f- l  I& K1 C$ y: K
    这种机制增加了编程的复杂性,并且容易导致程序员在忽略这个步骤时发生错误。
  • 信号可能丢失
    % p$ V; G3 K, z1 i# G% U# N        另一个更严重的问题是不可靠信号可能会丢失。
    0 r5 T, D1 X3 i当进程正在处理一个信号时,如果相同类型的另一个信号到达,第二个信号可能会被直接丢弃,导致进程错过了重要的事件。
    , Q; Y* g/ Z" \7 K6 G7 i5 D0 `这在关键任务应用中尤其危险。9 O: V4 R6 g3 [7 x

    ' q) ?' d1 |# I虽然Linux仍然支持不可靠信号机制,但对其进行了改进。Linux修复了在信号处理函数执行后必须手动重新绑定处理函数的问题。在现代Linux系统中,一旦信号处理函数被绑定,除非显式更改,否则它将一直保持有效。
    $ F- V7 C. e! G/ H+ I/ N3 m" Z- U/ m
    2 W; F. s, w* Z( Z  i然而,信号丢失问题仍然存在。这意味着,在处理不可靠信号时,如果在信号处理期间有相同信号再次到达,该信号可能无法被捕获。
    ) C4 Z: G% v( ]& i7 a) P2 U7 H: A; S% P" H2 J
    1.2、可靠信号
    - V. z2 t% ~; w3 `5 G8 q1 ~8 ^为了克服不可靠信号的缺陷,Linux引入了可靠信号机制。可靠信号支持排队,即使进程在处理某个信号时有新的信号到达,这些信号也不会丢失,而是被加入队列,待当前信号处理完成后再依次处理。
    2 g- N9 d% A: f
    # S" Y( \2 f2 l& ^3 q& V; N* mLinux还引入了新的信号发送函数sigqueue()和信号绑定函数sigaction(),进一步增强了信号处理的灵活性和可靠性。sigqueue()不仅可以发送信号,还可以附带一个整数值或指针,传递额外的信息。sigaction()则允许更精细地控制信号的行为,替代了传统的signal()函数。
    ; b" o8 |2 I- \; Z2
    . B5 t' J1 g- `4 a  M5 q实时信号和非实时信号+ D2 t1 F1 h, i  L
    Linux信号的另一种分类方式是根据实时性来区分为实时信号非实时信号* a- x0 S$ U0 d

    / l/ [, l: x/ M
    7 p! B% s4 y; S
    2.1、非实时信号  d6 \( Z& O5 B
    非实时信号指的是传统的、不支持排队的信号。这类信号在早期的UNIX系统中得以引入,信号编号一般在1到31之间。这些信号在处理时没有严格的顺序保证,并且如果在处理某个信号时有相同类型的新信号到达,后者可能会被忽略或丢失。因此,这类信号被称为不可靠信号1 C# J& i8 v9 |9 x" m2 @

    2 `5 b) b. ?1 ^& O
    8 D  a0 o% w7 d6 {" H! W( b/ t8 Z
    2.2、实时信号
    0 B# N9 g- G  J1 E. X: Z2 u实时信号是为了解决非实时信号在处理可靠性方面的不足而引入的。实时信号的一个显著特点是它们支持排队,即使在处理某个信号期间有新的相同类型的信号到达,这些信号也不会被丢弃,而是按照到达的顺序依次处理。这样,实时信号保证了多个信号都能被正确接收和处理,因此它们被称为可靠信号
    + {  V7 A- b$ C
    - v- A0 l: z6 x1 S) @: Q在实际编程中,开发者应当根据应用需求选择合适的信号类型。对于简单的进程间通信或用户交互,标准的非实时信号可能已经足够。而对于需要保证信号处理顺序且不能丢失的重要任务,使用可靠信号或实时信号是更好的选择。
    # K1 O7 P' i1 ?) n7 V3 a  w/ Y% Z3 P5 x: C" S$ [9 p( D" F

    2psq5klev0j6405875510.jpg

    2psq5klev0j6405875510.jpg

    7 m; |+ [/ S- j! o  l

    xquwevprfpn6405875610.gif

    xquwevprfpn6405875610.gif
    * |% i( a8 ], z/ v
    点击阅读原文,更精彩~
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表