【发布时间】:2019-03-06 16:35:31
【问题描述】:
我尝试使用 sigaction 安装信号处理程序,然后像这样在单个线程上调用它:
void
my_signal_handler ( int signo, siginfo_t *info, void *extra )
{
printf("my signal handler\n" );
}
int threadsupervisor() {
<...>
struct sigaction action;
struct sigaction oldHandler;
action.sa_flags = SA_SIGINFO;
action.sa_sigaction = my_signal_handler;
sigaction(SIGRTMIN + 3, &action, &oldHandler );
// send signal to affected thread
pthread_kill( threadId, SIGRTMIN + 3 );
// restore original signal handler
sigaction( SIGRTMIN + 3, &oldHandler, NULL );
}
线程确实收到 SIG37,然后整个应用程序终止。信号处理程序完成后程序/线程不应该继续吗?
问候
【问题讨论】:
-
你在valgrind下运行代码了吗?它应该会给你一些提示。
-
printf()在信号处理程序中是未定义的行为。您不能安全地从信号处理程序调用库函数。每footnote 188 of the C standard:“因此,信号处理程序通常不能调用标准库函数。” POSIX allow the use of async-signal-safe functions 可以从信号处理程序中调用。printf()不是其中之一。 -
您没有初始化
action或设置它的所有成员。初始化会更容易和更清洁。如果没有其中之一,您至少还会从系统尝试使用action.sa_mask中获得未定义的行为。 -
程序应该继续的初始假设是否正确?还是我必须提出 SIGCONT 才能继续?