0

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

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;

}

它应该每秒简单地打印到终端,但事实并非如此。谁能给我任何建议?

4

1 回答 1

0

谁能给我任何建议?

内核可能!如果系统调用失败,内核会报告错误代码。libc 将报告发生的错误并进行errno适当的设置。从而改变

setitimer(ITIMER_REAL, &it_val, NULL);

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

看看出了什么问题。相应的手册页将包含可能的错误代码及其原因的列表:

   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.

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

于 2018-12-04T06:11:45.423 回答