我有一段这样的代码:
struct sigaction sigtstp_act;
sigtstp_act.sa_handler = sigtstp_handler;
sigemptyset(&sigtstp_act.sa_mask);
sigtstp_act.sa_flags = 0;
sigaction(SIGTSTP, &sigtstp_act, NULL);
这是hanlder的代码:
void sigtstp_handler(int signo) {
printf("SIGTSTP received. Going to new file...\n");
fclose(f);
goto_next_file();
return;
}
这是go_to_next_file
函数:
void go_to_next_file() {
//Increments file_number, opens a new file to write to.
file_number += 1;
char filename[32];
snprintf(filename, sizeof(char) * 32, "%i.txt", file_number);
f = fopen(filename, "w");
//Check if opening a new file was successful.
if (f == NULL)
{
printf("Error opening file!\n");
exit(1);
}
}
但是在第一次发生SIGTSTP之后,我的处理程序被删除并恢复了默认行为。 如何通过sigaction()永久安装我的处理程序?
答案 0 :(得分:1)
您应该避免在信号处理程序中调用不安全的函数。如manual:
中所述,它会导致未定义的行为如果信号中断了不安全功能的执行, 处理程序要么调用不安全的函数,要么处理程序通过a终止 调用longjmp()或siglongjmp(),程序随后调用 一个不安全的函数,那么程序的行为是不确定的。
您可以在手册中看到安全功能列表。您的大多数功能都不在列表中。最好的方法是在信号处理程序中设置volatile
标志,并处理主程序执行中的所有内容。