因此,我试图拨打一个警报,以每秒显示一条消息“仍在工作……”。
我包括了signal.h。
在我的main之外,我有我的功能:(我从未为int声明/定义s)
void display_message(int s); //Function for alarm set up
void display_message(int s) {
printf("copyit: Still working...\n" );
alarm(1); //for every second
signal(SIGALRM, display_message);
}
然后,在我的主
while(1)
{
signal(SIGALRM, display_message);
alarm(1); //Alarm signal every second.
循环一开始就在那里。但是程序从不输出“还在工作...”消息。我做错了什么?谢谢,非常感谢。
最佳答案
信号处理程序不应包含“业务逻辑”或进行诸如printf
之类的库调用。参见C11§7.1.4/4及其脚注:
信号处理程序应该做的所有事情就是设置一个要由非中断代码执行的标志,并解除阻塞正在等待的系统调用。即使添加了某些I/O或其他功能,该程序也可以正常运行并且不会崩溃:
#include <signal.h>
#include <stdio.h>
#include <stdbool.h>
#include <unistd.h>
volatile sig_atomic_t print_flag = false;
void handle_alarm( int sig ) {
print_flag = true;
}
int main() {
signal( SIGALRM, handle_alarm ); // Install handler first,
alarm( 1 ); // before scheduling it to be called.
for (;;) {
sleep( 5 ); // Pretend to do something. Could also be read() or select().
if ( print_flag ) {
printf( "Hello\n" );
print_flag = false;
alarm( 1 ); // Reschedule.
}
}
}