ualarm()函数浅析

函数原型

//come from /usr/include/unistd.h

extern __useconds_t ualarm(__useconds_t __value,__useconds_t __interval)

函数调用成功时,返回原alarm()函数剩余的微秒数,若不存在alarm()函数则返回0,出错的情况下返回-1;

详细描述看man中的介绍。

注意看ERRORS:EINVAL 说函数中的两个参数不小于1000000时候,将会出错。所以使用时候注意参数的大小。

看下面本人写的一个测试程序:

#include <unistd.h>
#include <signal.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
void handler(void)
{
 printf("time up\n");
}
int main()
{
 int i=0;
 int rev;
 signal(SIGALRM,(__sighandler_t)handler);
 rev=ualarm(999999,500000);
 if(rev==-1)
 {
  perror("ualarm:");
  exit(1);
 }
 while(1)
 {
  sleep(1);
  printf("i=%d\n",i++);
 }
 return 0;
}

按照程序的本意应该是每秒输出两次time up,输出一次i的数值,真实的结果是这样吗?不是!可以自己测试下看看,把ualarm(999999,500000);中第二个参数改为200000希望每秒能输出5次time up,输出一次i的数值,但你运行的结果发现还是不对,以上的结果都是输出一次time up后,输出一次i的数值。看下面

但是,time up输出的频率确实和ualarm()函数设定的是相吻合,这样我们可以估计一下,使用ualarm()对sleep()函数产生了干扰。就是说在每次软中断后会造成sleep()函数的退出。

原因分析:

以下是我在网上找到的一段话,感觉应该能是这个问题,但是目前还不太确定,因为有人这么说,sleep()与alarm(),本质他们是不同的,sleep是拨了一个临时实时定时器并等待定时器到期,而alarm是用进程唯一的实时定时器来定时唤醒等待信号到来的进程执行。按照上述的见解,那就应该没问题了,暂且把这个问题归为我说的那样吧,要是哪位博友看到了,明白的话,满帆给哦讲解一下,谢谢哈。

关于信号的一些函数:

1.kill产生一个信号:

  extern int kill (__pid_t __pid, int __sig);
  pid>0:将信号发送给进程的pid为pid的进程;
  pid=0:将信号发送给和当前进程在同一个进程组的所有进程;
  pid=-1:将信号发送给系统内的所有进程;
  pid<0:将信号发送给进程组号PGID为pid绝对值的所有进程;
  成功返回0;失败返回值-1.
2.raise自举一个信号:
  extern int raise (int __sig);
  它用来给当前进程发送一个信号,即唤醒一个进程。
3.alarm()定时:
  extern unsigned int alarm(unsigned int __seconds);
  定时产生信号,即在多少时间内产生SIGALRM信号;并不是循环产生,而是每调用一次,产生一次。
  如果sec为0,则取消所有先前发出报警的请求。
4.ualarm()定时:
  extern __usconds_t ualarm(__useconds_t __value, __useconds_t __interval);
  在使当前进程在指定时间(第一个参数)内产生SIGALRM信号,然后每隔指定时间(第二个参数)重复产生SIGALRM信号。
5.信号处理:
  (1)忽略此信号,但有两种信号不能被忽略:SIGKILL和SIGSTOP。
  (2)捕捉信号:
  (3)执行系统默认操作
6.signal安装信号:
  typedef void (*__sighandler_t) (int);
  extern __sighandler_t signal(int __sig, __sighandler_t __handler);
  第二个参数为处理信号的代码入口或下面几个宏:
  #define SIG_ERR ((__sighandler_t) -1);
  #define SIG_DFL  ((__sighandler_t) 0);
  #define SIG_IGN  ((__sighandler_t) 1);
7.sigaction安装信号:
  extern int sigaction (int __sig, struct sigaction * __act, struct sigaction * __oact);
  第一个参数为接收到的信号;
  第二个参数用来指定欲设置的信号处理信息;
  第三个参数将返回执行此程序前此信号处理信息;

 

ualarm()函数调用失败以及浅析相关推荐

  1. 关于对话框DoModal()函数调用失败的原因分析

    对话框DoModal()函数调用失败一般而言有两种表现形式:一是对话框弹不出来,但是没有错误提示:二是对话框弹不出来,同时伴随内存访问错误的提示框出现. 第一种表现主要是因为没有对资源句柄进行切换造成 ...

  2. linux调用一个函数失败 打印错误,linux下settimeofday函数调用失败,何故?解决办法...

    当前位置:我的异常网» C语言 » linux下settimeofday函数调用失败,何故?解决办法 linux下settimeofday函数调用失败,何故?解决办法 www.myexceptions ...

  3. 云函数调用失败的原因

    云函数调用失败的原因 关于第一个云函数在网上都可以查到 不过也会出现很多问题 本文主要讲解的是出现的问题如何解决 首先在云函数段一定要写上这三段 // 云函数入口文件 const cloud = re ...

  4. system函数调用失败

    背景 项目在一次升级版本后,发现在DSP发生异常后,没有生成dspcrash文件.该文件通过system函数,直接调用可执行程序.后来增加定位信息,发现system返回-1.而在串口上直接调用可执行程 ...

  5. 方法apply作用于对象sort时失败_浅析call、apply 与 bind

    点击上方蓝色字体轻松关注 前言 经典模式题:call.apply 与 bind的区别.来吧,今天搞一搞. call(thisArgs [,args...]) 该方法可以传递一个thisArgs参数和一 ...

  6. ffmpeg函数调用失败--在编译自己的ffmpeg函数的时候显示ffmpeg函数undefined reference to `av_log_set_level(int)‘

    cmake 脚本报错如下: ====================[ Build | ffmpeg_log | Debug ]============================== /opt/ ...

  7. mysql 回滚失败_浅析Mysql 数据回滚错误的解决方法

    MYSQL的事务处理主要有两种方法.1.用begin,rollback,commit来实现begin 开始一个事务 rollback 事务回滚 commit 事务确认 2.直接用set来改变mysql ...

  8. 解决QTcpSocket类中readAll()函数调用失败问题

    运行环境:VS2013+Qt5.5 错误提示: 首先,我们需要去跟踪代码确定是由于那一条语句引起的错误,经过排查发现在执行下面语句的时候触发的该错误. 解决方案: 1.选定项目,点击右键,选择&quo ...

  9. 浅析android手游lua脚本的加密与解密(番外篇之反编译的对抗)

    前言   去年在看雪论坛写了一篇<浅析android手游lua脚本的加密与解密>的精华文章,今年写一篇番外篇,将一些lua反编译对抗的内容整合一起,并以3个实例作为说明(包括2018腾讯游 ...

最新文章

  1. 制作windows7 USB启动盘
  2. So many interfaces!
  3. 关于datagridview自动增加行高度和显示全部内容的设置
  4. mr图像翻转的原因_CSS图片翻转例子
  5. epub java虚拟机精讲_高级 Java 必须掌握:JVM 分析工具和查看命令,超详细!
  6. 计算机系统的组成doc,计算机系统的基本组成.doc
  7. 计算机维修与销售探讨,《计算机维修与维护》面向市场教学的探讨.pdf
  8. 凭一张照片找到视频中你所有的镜头,包括背影丨商汤ECCV 2018论文
  9. import package java_java初学者,如何理解package和import?
  10. localStorage、sessionStorage详解,以及storage事件使用
  11. BIO、NIO、AIO差别
  12. Web课设——HIS系统
  13. appium startActivity使用方法
  14. 【JZOJ】给水(water)
  15. 蓄力-利用POI进行excel的导入导出(包含图片)
  16. 买卖股票的最佳时间含手续费的代码实现
  17. Python 读书笔记(1)
  18. java运行时加音乐_Java运行窗体/程序添加自定义背景音乐
  19. 黑马程序员_JAVA之IO流(其他IO流)
  20. win7资源服务器未响应,Win7资源管理器未响应怎么办 试试这个方法 - 驱动管家

热门文章

  1. 靠死腾讯,QQ2009不能安装也不能删……
  2. 支付系统架构V1.0
  3. 2018年一季度总结
  4. 如何修复Google Chrome中的Shockwave Flash崩溃
  5. 洛谷题库P1765手机C语言,[模拟] [洛谷] P1765 手机
  6. 自制作的一个手机平衡球游戏!
  7. 透光按键激光打标机,激光打标机
  8. 百度语音-JAVA对PCM文件格式处理
  9. 【DEM格式转换】转换国标DEM数据格式为通用格式
  10. 解释性差?机器学习解释利器:SHAP原理及实战