alarm函数
alarm函数
设置定时器(闹钟)。在指定seconds后,内核会给当前进程发送14)SIGALRM信号。进程收到该信号,默认动作终止。
每个进程都有且只有唯一个定时器。
unsigned int alarm(unsigned int seconds); 返回0或剩余的秒数,无失败。
常用:取消定时器alarm(0),返回旧闹钟余下秒数。
例:alarm(5) → 3sec → alarm(4) → 5sec → alarm(5) → alarm(0)
定时,与进程状态无关(自然定时法)!就绪、运行、挂起(阻塞、暂停)、终止、僵尸...无论进程处于何种状态,alarm都计时。
练习:编写程序,测试你使用的计算机1秒钟能数多少个数。 【alarm .c】
使用time命令查看程序执行的时间。 程序运行的瓶颈在于IO,优化程序,首选优化IO。
实际执行时间 = 系统时间 + 用户时间 + 等待时间
/***
alarm.c
***/
#include<stdio.h>
#include<unistd.h> int main()
{
int i;
alarm();
for(i = ; ; i++)
{
printf("%d\n",i);
}
return ;
}
/***
my_alarm.c
***/
#include<stdio.h>
#include<sys/time.h>
#include<stdlib.h>
#include<unistd.h> /*
struct itimerval{
struct timeval
{
it_value.tv_sec;
it_value.tv_usec;
}it_interval; struct timerval{
it_value.tv_sec;
it_value.tv_usec;
}it_value;
}it,oldit; */
unsigned int my_alarm(unsigned int sec)
{
struct itimerval it,oldit;
int ret; it.it_value.tv_sec = sec;
it.it_value.tv_usec = sec;
it.it_interval.tv_sec = sec;
it.it_interval.tv_usec = sec; ret = setitimer(ITIMER_REAL,&it,&oldit);
if(- == ret)
{
perror("setitimer");
exit();
}
return oldit.it_value.tv_sec; } int main()
{
int i;
my_alarm(); for(i = ; ; i++)
{
printf("i = %d\n",i);
}
return ;
}
setitimer函数
设置定时器(闹钟)。 可代替alarm函数。精度微秒us,可以实现周期定时。
int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value); 成功:0;失败:-1,设置errno
参数:which:指定定时方式
① 自然定时:ITIMER_REAL → 14)SIGLARM 计算自然时间
② 虚拟空间计时(用户空间):ITIMER_VIRTUAL → 26)SIGVTALRM 只计算进程占用cpu的时间
③ 运行时计时(用户+内核):ITIMER_PROF → 27)SIGPROF 计算占用cpu及执行系统调用的时间
练习: 使用setitimer函数实现alarm函数,重复计算机1秒数数程序。 【setitimer.c】
拓展练习,结合man page编写程序,测试it_interval、it_value这两个参数的作用。 【setitimer1.c】
提示: it_interval:用来设定两次定时任务之间间隔的时间。
it_value:定时的时长
两个参数都设置为0,即清0操作。
raise和abort函数
raise 函数:给当前进程发送指定信号(自己给自己发) raise(signo) == kill(getpid(), signo);
int raise(int sig); 成功:0,失败非0值
abort 函数:给自己发送异常终止信号 6) SIGABRT 信号,终止并产生core文件
void abort(void); 该函数无返回
alarm函数的更多相关文章
- 三十一、Linux 进程与信号——SIGCHLD 信号、kill和raise函数以及alarm函数
		
31.1 SIGCHLD 信号 子进程状态发生变化(子进程结束)产生该信号,父进程需要使用 wait 调用来等待子进程结束并回收它. 避免僵尸进程 #include <stdio.h> # ...
 - linux C之alarm函数 转
		
原文出处:http://blog.sina.com.cn/s/blog_6a1837e90100uhl3.html alarm也称为闹钟函数,alarm()用来设置信号SIGALRM在经过参数seco ...
 - alarm()函数的使用总结
		
alarm()函数说明 1.引用头文件:#include <unistd.h>; 2.函数标准式:unsigned int alarm(unsigned int seconds); 3.功 ...
 - linux alarm函数解除read write等函数的阻塞
		
看到apue的第十章,说到alarm,pause可以实现sleep,可以让某些一直阻塞的函数超时,例如read,write.代码如下: static void sig_alrm(int signo) ...
 - 关于alarm函数
		
#include<unistd.h> #include<signal.h> void handler() { printf("Hello\n"); sign ...
 - alarm函数可以定时
		
貌似是可以的,不过感觉好像这样用不是很好,最好还是用回timer_settimer一些列函数吧,不过既然开了头,就看下alarm怎么用吧. 1. 所需头文件 #include<unistd.h ...
 - linux中alarm函数和pause函数详解实例
		
alarm(time);执行之后告诉内核,让内核在time秒时间之后向该进程发送一个定时信号,然后该进程捕获该信号并处理:pause()函数使该进程暂停让出CPU,但是该函数的暂停和前面的那个slee ...
 - 信号之alarm和pause函数
		
使用alarm函数可以设置一个计时器,在将来某个指定的时间,该计时器会超时.当计时器超时时,产生SIGALRM信号.如果不忽略或不捕捉此信号,则其默认动作是终止调用该alarm函数的进程. #incl ...
 - UNIX环境高级编程——信号之kill、raise、killpg、alarm、pause、abort、sleep、usleep、nanosleep和setitimer函数
		
一.kill, raise, killpg 函数 int kill(pid_t pid, int sig); int raise(int sig); int killpg(int pgrp, int ...
 
随机推荐
- CTS & APIO 2019 游记
			
写在前面 算是省选后的第一轮大考. 去年因为某些原因并没有参加 CTSC 以及 APIO,还是有些遗憾,所以希望今年能有所收获. 也希望今年的 CTS 能延续去年的出题风格,这样我还能苟一两个题. 然 ...
 - springboot mvc自动配置(二)注册DispatcherServlet到ServletContext
			
所有文章 https://www.cnblogs.com/lay2017/p/11775787.html 正文 上一篇文章中,我们看到了DispatcherServlet和DispatcherServ ...
 - python处理RSTP视频流
			
python链接海康摄像头,并以弹出框的方式播放实时视频流, 这种方式是以弹出框的形式播放.本地测试可以,实际业务场景不建议使用.可以采用rtsp转rtmp的方式 @shared_task def p ...
 - Vue页面手动刷新,导航栏激活项还原到初始状态问题解决方案
			
场景描述:在页面中存在顶部导航和左侧导航,左侧导航和右侧内容区使用了命名视图实现,点击左侧导航的链接时,右侧内容区相应显示不同组件内容.问题:在当前链接手动刷新浏览器(例如:浏览器地址为/enterp ...
 - 如何在 vue 2.0+ 中引入全局的stylus文件,且能正常
			
由于stylus在引用时,不能像一般的css文件直接在main.js中引用,就算引用了也会只能使用转换后的css,不能使用里面的函数,方法等,原因可能是:在这里引入会被直接编译成css,不能在别的模板 ...
 - 关于微信小程序获取view的动态高度填坑
			
wx.createSelectorQuery().select('#box').boundingClientRect(function (rect) { width = rect.width heig ...
 - react请求接口数据是在componentDidMount 还是componentWillMount周期好
			
如果你要获取外部数据并加载到组件上,只能在组件"已经"挂载到真实的网页上才能作这事情,其它情况你是加载不到组件的.componentDidMount方法中的代码,是在组件已经完全挂 ...
 - MySQL锁表解决方法
			
https://blog.csdn.net/a5582ddff/article/details/79566678 MySQL锁表解决方法 一.我的处理过程 1.查进程,主要是查找被锁表的那个进程的ID ...
 - Image Processing and Analysis_15_Image Registration:A survey of medical image registration——1998
			
此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...
 - 集成IDE anaconda
			
Anaconda 下载安装完anaconda后,会生成如下工具: 安装Anaconda不需要使用管理员权限.安装完毕后,Anaconda附带一个图形启动器(Anaconda Prompt),可以使用他 ...