【发布时间】:2013-08-28 02:58:28
【问题描述】:
我目前正在尝试设置一些信号处理程序。具体来说,我想安装一个 SIGQUIT 处理程序,它会恢复为默认处理,但会在 n 秒后重新安装 SIGQUIT 处理程序。
当我最初在 main() 中安装信号处理程序时没有问题,但是当我添加代码以尝试在我的 SIGALRM 处理程序中重新安装我的 SIGQUIT 处理程序时,我在编译时不断收到以下错误消息:
ish.c: In function ‘SIGALRM_Handler’:
ish.c:42: error: ‘SIGQUIT_Handler’ undeclared (first use in this function)
ish.c:42: error: (Each undeclared identifier is reported only once
ish.c:42: error: for each function it appears in.)
这里是相关的sn-ps代码。我只想在触发警报时重新安装 SIGQUIT 处理程序,但我不确定如何继续?
/* SIGALRM handler */
static void SIGALRM_Handler(int iSig)
{
void (*pfRet)(int);
/* reinstall SIGQUIT handler */
pfRet = signal(SIGQUIT, SIGQUIT_Handler);
if (pfRet == SIG_ERR) { perror("SIGQUIT_Handler"); exit(EXIT_FAILURE); }
}
/*--------------------------------------------------------------------*/
/* SIGQUIT handler */
static void SIGQUIT_Handler(int iSig)
{
void (*pfRet)(int);
/* Print message followed by shell prompt */
printf("Type Ctrl-\\ again within 5 seconds to exit\n");
printf("------------------------------------\n");
printf("%c ", '%');
fflush(NULL);
/* install default SIGQUIT handling */
pfRet = signal(SIGQUIT, SIG_DFL);
if (pfRet == SIG_ERR) { perror("SIGQUIT_Handler"); exit(EXIT_FAILURE); }
/* set alarm for 5 seconds later */
alarm(5);
}
...
int main(int argc, char **argv)
{
FILE *psFile;
void (*pfRet)(int);
sigset_t sSet;
int iRet;
assert(argv != NULL);
/* make sure needed signals are not blocked */
sigemptyset(&sSet);
sigaddset(&sSet, SIGINT);
sigaddset(&sSet, SIGQUIT);
sigaddset(&sSet, SIGALRM);
iRet = sigprocmask(SIG_UNBLOCK, &sSet, NULL);
if (iRet == -1) { perror(argv[0]); exit(EXIT_FAILURE); }
/* install SIGINT handler */
pfRet = signal(SIGINT, SIGINT_Handler);
if (pfRet == SIG_ERR) { perror(argv[0]); exit(EXIT_FAILURE); }
/* install SIGALRM handler */
pfRet = signal(SIGALRM, SIGALRM_Handler);
if (pfRet == SIG_ERR) { perror(argv[0]); exit(EXIT_FAILURE); }
/* install SIGQUIT handler */
pfRet = signal(SIGQUIT, SIGQUIT_Handler);
if (pfRet == SIG_ERR) { perror(argv[0]); exit(EXIT_FAILURE); }
/* check for configuration file */
if (argc > 2)
{
fprintf(stderr, "Usage: ish [configfile]\n");
exit(EXIT_FAILURE);
}
else if (argc == 2)
{
psFile = fopen(argv[1], "r");
if (psFile != NULL)
{
handleProcess(psFile);
}
else
{
fprintf(stderr, "ish: ");
perror(argv[1]);
}
}
for(;;)
{
handleProcess(stdin);
}
return 0;
}
【问题讨论】:
-
OT:信号处理程序只能调用异步信号安全函数。在此页面的 2.4.2 下方:pubs.opengroup.org/onlinepubs/9699919799/functions/… 有一个功能列表(在 POSIX 兼容系统下)保证是这样的。
printf()不在此列表中。