gpt4 book ai didi

C: SIGALRM - 每秒显示消息的警报

转载 作者:太空狗 更新时间:2023-10-29 16:59:07 27 4
gpt4 key购买 nike

因此,我尝试调用警报以每秒显示一条消息“仍在工作......”。我包含了 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 及其脚注:

Thus, a signal handler cannot, in general, call standard library functions.

所有信号处理程序应该做的就是设置一个标志以供非中断代码执行,并解除等待系统调用的阻塞。这个程序运行正确,不会有崩溃的风险,即使添加了一些 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.
}
}
}

关于C: SIGALRM - 每秒显示消息的警报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21542077/

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