gpt4 book ai didi

c - 使用 sigaction 将信号处理行为重置为默认值

转载 作者:太空宇宙 更新时间:2023-11-03 23:43:37 25 4
gpt4 key购买 nike

我有一段代码是这样的:

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);

这是处理程序的代码:

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

最佳答案

您应该避免在信号处理程序中调用不安全的函数。它会导致未定义的行为,如 manual 中所述:

If a signal interrupts the execution of an unsafe function, and handler either calls an unsafe function or handler terminates via a call to longjmp() or siglongjmp() and the program subsequently calls an unsafe function, then the behavior of the program is undefined.

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

关于c - 使用 sigaction 将信号处理行为重置为默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39501942/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com