我在vxworks手册中遇到了以下内容,并想知道为什么会这样 .
信号做什么类型的事情会使它们变得不受欢迎?
在应用程序中,信号最适合于错误和异常处理,而不适用于通用的任务间通信 .
信号的主要问题是信号处理程序是基于每个进程/内存空间注册的(在vxWorks中,内核代表一个内存空间,每个RTP是不同的内存空间) .
这意味着无论线程/任务上下文如何,都将执行相同的信号处理程序(对于给定的进程) . 如果您的信号处理程序表现不佳,这可能会导致一些副作用问题 .
例如,如果您的信号使用互斥锁来保护共享资源,则可能会导致令人讨厌的问题,或者至少会出现意外行为
Task A Task B Signal Handler Take Mutex ... Gets preempted does something .... <SIGNAL ARRIVES>----->Take Mutex (blocks) resumes .... Give Mutex ----->Resumes Handler
我不确定上面的例子真的传达了我想要的东西 . 以下是信号的其他一些特征:
在安排任务/进程之前,不会执行处理程序 . 仅仅因为你发送了信号,并不意味着处理程序会立即执行
无法保证哪个任务/线程将执行处理程序 . 进程中的任何线程/任务都可以运行它(无论哪个线程/任务首先执行) . VxWorks可以解决这个问题 .
请注意,上述内容仅适用于通过kill调用发送的异步信号 .
异常将生成一个同步信号,该信号将立即在当前上下文中执行 .
1 回答
信号的主要问题是信号处理程序是基于每个进程/内存空间注册的(在vxWorks中,内核代表一个内存空间,每个RTP是不同的内存空间) .
这意味着无论线程/任务上下文如何,都将执行相同的信号处理程序(对于给定的进程) . 如果您的信号处理程序表现不佳,这可能会导致一些副作用问题 .
例如,如果您的信号使用互斥锁来保护共享资源,则可能会导致令人讨厌的问题,或者至少会出现意外行为
我不确定上面的例子真的传达了我想要的东西 . 以下是信号的其他一些特征:
在安排任务/进程之前,不会执行处理程序 . 仅仅因为你发送了信号,并不意味着处理程序会立即执行
无法保证哪个任务/线程将执行处理程序 . 进程中的任何线程/任务都可以运行它(无论哪个线程/任务首先执行) . VxWorks可以解决这个问题 .
请注意,上述内容仅适用于通过kill调用发送的异步信号 .
异常将生成一个同步信号,该信号将立即在当前上下文中执行 .