繁体   English   中英

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

[英]How to use setitimer with SIGALRM in C

我正在尝试使用setitimer发送SIGALRM,这反过来又调用我的处理程序函数以打印到stdout。 我已经在互联网上搜寻了几个小时,并且没有明确的迹象表明应如何使用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;

}

它应该仅每秒打印一次到终端,但不是。 谁能给我任何建议?

谁能给我任何建议?

内核可能! 如果系统调用失败,则内核将报告错误代码。 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. 

该修复程序是发件人的一项练习。 也不要习惯从信号处理程序内部调用非异步信号安全函数!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM