信号处理行为通过sigaction重置为默认值

时间:2016-09-15 01:31:04

标签: c

我有一段这样的代码:

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()永久安装我的处理程序?

1 个答案:

答案 0 :(得分:1)

您应该避免在信号处理程序中调用不安全的函数。如manual

中所述,它会导致未定义的行为
  

如果信号中断了不安全功能的执行,   处理程序要么调用不安全的函数,要么处理程序通过a终止   调用longjmp()或siglongjmp(),程序随后调用   一个不安全的函数,那么程序的行为是不确定的。

您可以在手册中看到安全功能列表。您的大多数功能都不在列表中。最好的方法是在信号处理程序中设置volatile标志,并处理主程序执行中的所有内容。