免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1552 | 回复: 6

[Linux] 调用alarm函数,信号处理函数没输出? [复制链接]

论坛徽章:
0
发表于 2013-10-23 20:22 |显示全部楼层
本帖最后由 du2he 于 2013-10-23 20:22 编辑

在学到信号编程的时候,接触到alarm这个函数,尝试用它编写了如下程序,可是程序执行后没有结果输出。
我想要实现的功能是:不断调用alarm函数,让n不断进行自减,每调用一次输出一次n的值。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

static int n=10;
void handle_alarm(signo);
{
  n--;
  if(n!=0)
  printf("%d\n",n);
  else
  printf("time is out!\n");
  exit(0);
}

int main()
{
  int i=0;
  for(i=0;i<10;i++)
  {
    signal(SIGALRM,handle_alarm);
    alarm(1);
  }
  return 0;
}

论坛徽章:
0
发表于 2013-10-23 20:27 |显示全部楼层

论坛徽章:
0
发表于 2013-10-24 08:58 |显示全部楼层
继续等解答。。。。

论坛徽章:
1
射手座
日期:2013-11-07 09:19:48
发表于 2013-10-24 11:22 |显示全部楼层
Hi, 改成如下这样试试,你的信号处理函数一直没法调度到,“Alarm requests are not stacked; only one SIGALRM generation can be scheduled in this manner. If the SIGALRM signal has not yet been generated, the call shall result in rescheduling the time at which the SIGALRM signal is generated.”
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

static int n=10;
void handle_alarm(signo);
{
  printf("time is out!\n");

  alarm(1);
  return;
}

int main()
{
    signal(SIGALRM,handle_alarm);
    alarm(1);

  return 0;
}

论坛徽章:
0
发表于 2013-10-24 15:21 |显示全部楼层
谢谢你,可是我测试了一下还是不可以。在信号处理函数里再调用一次还是没有打印出来。。。这个会不会跟多次调用alarm有关呢?
回复 4# guocslock


   

论坛徽章:
1
射手座
日期:2013-11-07 09:19:48
发表于 2013-10-24 16:24 |显示全部楼层
回复 5# du2he

想多次触发请在main的return前加一个while(1)循环,进程都结束了,怎么可能再次触发?
   

论坛徽章:
0
发表于 2013-10-24 20:38 |显示全部楼层
谢谢你!问题已经解决了,我在主函数main中的alarm后调用pause函数或者是sleep函数就可以实现让n自减并输出值的功能!
上网查了一下,这其实属于一个小bug吧,在alarm后调用pause可能会有这样一种情况出现:就是在pause之前alarm已经发出SIGALRM
信号,若没有其他中断,那么pause就永远挂起系统。可是现实的问题是:alarm在经过指定秒数后,SIGALRM信号由内核产生,由于进程调度的延迟,所以要处理该信号还需要一定的时间,所以一般情况下载执行alarm之前,pause已经执行了在等待信号的来临。
以上不知有没有理解错?
可我还是有一个问题:即使有SIGALRM信号处理函数,在alarm秒数结束后,进程像没有收到信号一样,用省缺方式处理,结束进程。
非要在alarm后加一个pause或者sleep(sleep的秒数不少于和alarm中的秒数)才可以成功捕获SIGALRM函数。
我的代码如下
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

static int n=10;
void handle_alarm(signo);
{
  n--;
  if(n!=0)
  printf("%d\n",n);
  else
  printf("time is out!\n");
  exit(0);
}

int main()
{
  int i=0;
  for(i=0;i<10;i++)
  {
    signal(SIGALRM,handle_alarm);
    alarm(1);
    pause();   //原来是没有的,加了后就可以实现如图倒数功能;若没有,执行后什么也没显示,如图最下端
  }
  return 0;
}

附图

附图
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。




----------------------------------------

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP