gpt4 book ai didi

c - 如何在 C 中将 setitimer 与 SIGALRM 一起使用

转载 作者:行者123 更新时间:2023-11-30 16:24:35 25 4
gpt4 key购买 nike

我正在尝试使用 setitimer 发送 SIGALRM,它又调用我的处理函数来打印到标准输出。我已经在互联网上搜索了几个小时,但根本没有明确指示应如何使用 setitimer。我尝试过各种组合,但似乎都不起作用。在我的代码中,我使用套接字和pthreads,但我不认为它与问题真正相关,因为我试图通过信号设置警报,这无论如何都会停止所有线程,所以我将保留该代码简单。

void handle_alarm(int sig){

printf("Printing Info\n");

}


int main(int argc, char**argv){

struct itimerval it_val;
signal(SIGALRM, handle_alarm);
it_val.it_value.tv_sec = 1;
it_val.it_value.tv_usec = 1000000;
it_val.it_interval = it_val.it_value;
setitimer(ITIMER_REAL, &it_val, NULL);
while(1){}

return 0;

}

它应该只是每秒打印到终端,但事实并非如此。谁能给我一些建议吗?

最佳答案

Can anyone give me any advice?

内核可能!如果系统调用失败,内核会报告一个错误代码。 libc 将报告发生的错误并相应地设置 errno 。从而改变

setitimer(ITIMER_REAL, &it_val, NULL);

if (setitimer(ITIMER_REAL, &it_val, NULL) == -1) {
perror("setitimer");
exit(1);
}

看看出了什么问题。 appropriate man page将包含可能的错误代码及其原因的列表:

   EFAULT new_value, old_value, or curr_value is not valid a pointer.

EINVAL which is not one of ITIMER_REAL, ITIMER_VIRTUAL, or
ITIMER_PROF; or (since Linux 2.6.22) one of the tv_usec fields
in the structure pointed to by new_value contains a value
outside the range 0 to 999999.

该修复留给提问者作为练习。另外,不要习惯从信号处理程序内部调用非异步信号安全函数!

关于c - 如何在 C 中将 setitimer 与 SIGALRM 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53606077/

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