static struct vsf_sysutil_sig_details
{
vsf_sighandle_t sync_sig_handler; /*信号同步处理函数*/
void* p_private; /*参数*/
int pending; /*pending 信号*/
int running; /*信号处理函数是否在运行状态*/
int use_alarm;
} s_sig_details[NSIG];
static void vsf_sysutil_common_sighandler(int signum)
{
if (signum < 0 || signum >= NSIG)
{
/* bug() is not async safe but this check really is a "cannot happen"
* debug aid.
*/
bug("signal out of range in vsf_sysutil_common_sighandler");
}
if (s_sig_details[signum].sync_sig_handler)
{
s_sig_details[signum].pending = 1;
/* Since this synchronous signal framework has a small race (signal coming
* in just before we start a blocking call), there's the option to fire an
* alarm repeatedly until the signal is handled.
*/
if (s_sig_details[signum].use_alarm)
{
alarm(1);
}
}
}
/* Notes. This signal check is evaluated after potentially blocking system
* calls, i.e. at highly defined points in the code. Since we only interrupt
* at these definite locations, the signal handlers can be non-trivial
* without us having to worry about re-entrancy.
*
* We guarantee that a handler for a given signal is not re-entrant. This