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函数的更多相关文章

  1. 三十一、Linux 进程与信号——SIGCHLD 信号、kill和raise函数以及alarm函数

    31.1 SIGCHLD 信号 子进程状态发生变化(子进程结束)产生该信号,父进程需要使用 wait 调用来等待子进程结束并回收它. 避免僵尸进程 #include <stdio.h> # ...

  2. linux C之alarm函数 转

    原文出处:http://blog.sina.com.cn/s/blog_6a1837e90100uhl3.html alarm也称为闹钟函数,alarm()用来设置信号SIGALRM在经过参数seco ...

  3. alarm()函数的使用总结

    alarm()函数说明 1.引用头文件:#include <unistd.h>; 2.函数标准式:unsigned int alarm(unsigned int seconds); 3.功 ...

  4. linux alarm函数解除read write等函数的阻塞

    看到apue的第十章,说到alarm,pause可以实现sleep,可以让某些一直阻塞的函数超时,例如read,write.代码如下: static void sig_alrm(int signo) ...

  5. 关于alarm函数

    #include<unistd.h> #include<signal.h> void handler() { printf("Hello\n"); sign ...

  6. alarm函数可以定时

    貌似是可以的,不过感觉好像这样用不是很好,最好还是用回timer_settimer一些列函数吧,不过既然开了头,就看下alarm怎么用吧. 1. 所需头文件  #include<unistd.h ...

  7. linux中alarm函数和pause函数详解实例

    alarm(time);执行之后告诉内核,让内核在time秒时间之后向该进程发送一个定时信号,然后该进程捕获该信号并处理:pause()函数使该进程暂停让出CPU,但是该函数的暂停和前面的那个slee ...

  8. 信号之alarm和pause函数

    使用alarm函数可以设置一个计时器,在将来某个指定的时间,该计时器会超时.当计时器超时时,产生SIGALRM信号.如果不忽略或不捕捉此信号,则其默认动作是终止调用该alarm函数的进程. #incl ...

  9. 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 ...

随机推荐

  1. python 创建es mapping

    import requests def get_(): url = "http://127.0.0.1:9200/indextest/_mapping?pretty" ss = r ...

  2. THUPC2019/CTS2019/APIO2019游记

    Day -? 居然还能报上thupc,我在队里唯一的作用大约是cfrating稍微高点方便过审.另外两位是lz和xyy. Day -2 我夫人生日! Day -1 lz和xyy的家长都来了带我飞.住在 ...

  3. PL/SQL Developer的错误提示弹框的文本显示乱码问题

    问题:Windows中文环境下,PL/SQL Developer的错误提示弹框文本为乱码,如下: 解决过程:1.使用SELECT * FROM v$nls_parameters;查询得知服务器的字符集 ...

  4. 一篇文章彻底搞懂异步,同步,setTimeout,Promise,async

    之前翻看别的大佬的博客看到了关于setTimeout,promise还有async执行顺序的文章.观看了几篇之后还是没有怎么看懂,于是自己开始分析代码,并整理了此文章,我相信通过此文章朋友们能对异步同 ...

  5. 减少打包组件vue.config.js——Webpack的externals的使用

    vue.config.js module.exports = { configureWebpack:{ externals: { vue: 'Vue', 'vue-router':'VueRouter ...

  6. Java数据结构总述

    array list map set 链表..array 和list类似,增删慢,读取快,list长度可变,array长度固定, 链表增删快的list set 是一个没有重复数据的集合 map 是一个 ...

  7. MyBatis核心组件

    SqlSessionFactoryBuilder (构造器) 会根据配置或者代码来生成SqlSessionFactory SqlSessionFactory (工厂接口) 以后他来生成SqlSessi ...

  8. python实现tcp代理

    1.代理流程图 2.实现代码 #! usr/bin/python2 import sys import socket import thread #handle local buffer def re ...

  9. python实现暴力破解

    import urllib2 import urllib import cookielib import threading import sys import Queue from HTMLPars ...

  10. 1、Java基础:面向对象六大原则

    本文主要介绍了面向对象六大原则. 单一职责原则(Single-Resposibility Principle). “对一个类而言,应该仅有一个引起它变化的原因.”本原则是我们非常熟悉地”高内聚性原则” ...