如何在 C 中将 setitimer 与 SIGALRM 结合使用
How to use setitimer with SIGALRM in C
我正在尝试使用 setitimer 发送一个 SIGALRM,它会依次调用我的处理函数来打印到标准输出。我已经在互联网上搜索了几个小时,根本没有明确说明应该如何使用 setitimer。我尝试了各种组合,但 none 似乎有效。在我的代码中,我使用了套接字和 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.
修复留给提问者作为练习。也不要习惯于从信号处理程序内部调用非异步信号安全函数!
我正在尝试使用 setitimer 发送一个 SIGALRM,它会依次调用我的处理函数来打印到标准输出。我已经在互联网上搜索了几个小时,根本没有明确说明应该如何使用 setitimer。我尝试了各种组合,但 none 似乎有效。在我的代码中,我使用了套接字和 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.
修复留给提问者作为练习。也不要习惯于从信号处理程序内部调用非异步信号安全函数!