当前位置:  技术问答>java/j2ee iis7站长之家

创建一个计时器,运行两次就进程中止了.问题在哪里呢?

    来源: 互联网  发布时间:2017-02-06

    本文导语:  我创建一个进程,目的是一个计时器每隔1s钟打印一个信息,无穷循环。  结果是执行了2s,打印了2次信息就结束了。问题出在哪里呢? 我是vmware里面安装的centos62     程序输出是:  $ g++ test1.cpp -lrt && ./a.out  signa...

我创建一个进程,目的是一个计时器每隔1s钟打印一个信息,无穷循环。 
结果是执行了2s,打印了2次信息就结束了。问题出在哪里呢? 我是vmware里面安装的centos62 
  
程序输出是: 
$ g++ test1.cpp -lrt && ./a.out 
signal: 34 
signal: 34 
我错在哪里? 代码如下: 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
  
void SigHandler(int sig, siginfo_t *si, void *uc) 

     char buf[64]; 
     sprintf( buf, "signal: %dn", sig); 
     write(STDOUT_FILENO,buf,strlen(buf)); 
  
     if (sig == SIGINT) 
     { 
         printf("SIGINTn"); 
         _exit(0); 
     } 
     else if (sig == SIGRTMIN) 
     { 
     } 

  
int CreateTimer(int sig, int sec) 

     struct sigaction act; 
  
     sigemptyset(&act.sa_mask); 
     act.sa_flags = SA_SIGINFO; 
     act.sa_sigaction = SigHandler; 
     if (sigaction(SIGINT, &act, NULL) == -1 
      || sigaction(SIGRTMIN, &act, NULL) == -1) 
     { 
         printf("sigaction failedn"); 
         return 0; 
     } 
  
     timer_t timerid; 
     struct sigevent sev; 
     struct itimerspec its; 
  
     sev.sigev_notify = SIGEV_SIGNAL; 
     sev.sigev_signo = sig; 
     sev.sigev_value.sival_ptr = &timerid; 
     if (timer_create(CLOCK_REALTIME, &sev, &timerid) == -1) 
     { 
         printf("timer_create errorn"); 
         return 0; 
     } 
  
     its.it_value.tv_sec = sec; 
     its.it_value.tv_nsec = 0; 
     its.it_interval.tv_sec = its.it_value.tv_sec; 
     its.it_interval.tv_nsec = its.it_value.tv_nsec; 
  
     if (timer_settime(timerid, 0, &its, NULL) == -1) 
     { 
             printf("timer_settime errorn"); 
         return 0; 
     } 
     return 1; 

  
int main(void) 

         if(!CreateTimer(SIGRTMIN, 1))return 1; 
         sleep(5); 
         getchar(); 
         return 0; 

|
你这样不能无限循环
信号依次中断了你的sleep(5) 与getchar(),程序就结束了

在main()中添加一句
while(1) pause();

|
没有办法让信号不中断你的recv,除非你忽略了这个信号,或者临时屏蔽了这个信号。

被信号中断时,recv()失败,对应的错误码errno通常是EINTR,
你可以判断这个错误码,然后循环调用recv

或者你可以在信号处理函数中设置一个全局变量,recv失败时判断这个全局变量,以辨别是否被信号中断

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ Bitsets 成员 Constructors:创建新bitsets
  • 菜鸟在c盘装了win2000,想在剩下的空间装Red Hat Enterprise Linux 3,在创建linux分区的时候,不知道都创建什么分区??我知道要创建一个
  • C++ Double Ended Queues(双向队列) 成员 Constructors:创建一个新双向队列
  • 一进程源源不断地创建文件,另一进程把这些创建的文件抓取并挪走
  • C++ I/O 成员 open():创建一个输入流
  • 创建用户组创建用户出错
  • Xcode介绍及创建工程和工程依赖操作步骤
  • 进程创建进程组后,然后创建该组中的进程,然后终止。这里的终止....?
  • HTML5 sprite 样式创建工具Stitches介绍
  • linux如何创建一个共享内存 可以mount 可以创建目录之类 跟硬盘分区一样
  • java Servlet实现Session创建存取以及url重写代码示例
  • php循环创建目录示例分享(php创建多级目录)
  • navicat 8 创建数据库与创建用户分配权限图文方法
  • sql server 2008:您对无法重新创建的表进行了更改或者启用了“阻止保存重新创建表的更改”
  • mkdir()是创建文件夹的函数,有没有循环创建多个目录级的函数呢?
  • 各位高手知道在JAVA中如何用一个名称创建一个对象实例,并调用其方法,注意:在编写代码时并不知要创建的对象的类名,也并不知方法名
  • FTP上创建的文件夹的创建日期始终和本机的对不上(无论如何改变日期和时间)(紧急!!!)
  • 急!linux下mysql的创建用户组和创建用户命令不能生效啊????
  • 怎么创建包,我创建包后,怎么找不到呢?
  • C语言中有指针,因此C语言可以创建链表,那么Java语言没有指针,那Java是否可以创建链表呢?
  • 100求解:如何在UNIX环境下创建一个新的端口号?另:能告之如何在WINDOWS2000环境下创建一个新的端口号就更好了!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3