首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C中与SIGALRM结合使用setitimer

如何在C中与SIGALRM结合使用setitimer
EN

Stack Overflow用户
提问于 2018-12-04 05:14:11
回答 1查看 2.8K关注 0票数 0

我试图使用setitimer发送一个SIGALRM,它反过来调用我的处理程序函数打印到stdout。我已经在互联网上浏览了几个小时了,根本就没有关于如何使用setitimer的明确指示。我试过各种组合,但似乎都没有用。在我的代码中,我使用的是套接字和线程,但我认为它与这个问题并没有真正的关系,因为我试图通过一个信号设置一个警报,这会使所有线程停止,所以为了简单起见,我将不使用该代码。

代码语言:javascript
复制
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;

}

它应该简单地打印到终端每秒钟,但它没有。有人能给我提点建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-04 06:11:45

有人能给我提点建议吗?

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

代码语言:javascript
复制
setitimer(ITIMER_REAL, &it_val, NULL);

代码语言:javascript
复制
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.

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53606077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档