【发布时间】:2013-10-10 12:14:19
【问题描述】:
有一个关于中断正在侦听信号的正在运行的进程的问题。下面是我的处理程序。 SIGHUP 用于重新加载我的配置文件,SIGCHLD 用于在它产生的进程上等待没有挂起的进程,而其他进程则用于终止进程。
void sig_handler( int sig, siginfo_t *siginfo, void *ucontext )
{
if ( sig == SIGHUP ) {
reload = 1;
} else if( sig == SIGCHLD) {
// TODO
} else if ( sig == SIGTERM || sig == SIGKILL || sig == SIGINT ) {
done = 1;
}
}
do {
if(reload) {
// opening files, doing file descriptor stuff
... // processing...
**SIHUP OCCURS! WHAT HAPPENS?** <<<<<<<<<<< Line: 505 <<<<<<<<<<<<<<<<<<
... // processing...
}
} while(!done);
我目前对信号的理解:
- 信号出现
- 在第 505 行完成当前操作。即:open("t.txt");
- 运行信号处理程序代码以完成
- 返回第 505 行并继续
我担心的是:
- 信号出现
- 跳出当前代码
- 运行信号处理程序代码以完成
- 继续破解代码
问题:
- 是否应该在重新加载配置时增强我的代码以阻止 SIGHUP、SIGTERM、SIGCHLD,以便在出现信号时不会出现不稳定的代码?还是过度设计? (假设它不会在之后恢复)
- 假设我在 SIGHUP 的信号处理程序中,但随后出现 SIGHUP 信号,会发生什么? (我假设它将它们排队并运行处理程序两次)
谢谢!
【问题讨论】: