2011-05-09 30 views
3

我在vxworks手册中发现了以下内容,并想知道为什么会出现这种情况。Linux/vxworks信号

信号做什么类型的事情使他们不受欢迎?

在实际应用中,信号是 最适合用于错误和异常处理 ,而不是一个 通用任务间通信 。

回答

3

与信号的主要问题是处理程序是基于每个进程/内存空间基础注册的信号(在VxWorks中,内核表示一个存储器空间,并且每个RTP是不同的存储器空间)。

这意味着无论线程/任务上下文如何,都会执行相同的信号处理程序(对于给定的进程)。如果您的信号处理程序表现不好,这可能会导致一些副作用问题。

例如,如果你的信号使用一个互斥体的保护共享资源,这可能会导致讨厌的问题,或者至少,意外的行为

 
    Task A      Task B    Signal Handler 
    Take Mutex 
    ... 
    Gets preempted 
           does something 
           .... 
           <SIGNAL ARRIVES>----->Take Mutex (blocks) 
    resumes 
    .... 
    Give Mutex 
               ----->Resumes Handler 

我不知道上面的例子中真正传达了我正在努力。 以下是信号的一些其他特性:

  • 处理程序在执行任务/过程之前不会执行。仅仅因为您发送了信号,并不意味着处理程序将立即执行
  • 不保证Task/Thread将执行处理程序。进程中的任何线程/任务都可以运行它(无论哪个线程/任务先执行)。 VxWorks有办法解决这个问题。

请注意,以上仅适用于通过kill调用发送的异步信号。

异常会产生一个同步信号,在当前上下文中马上执行。