> 文章列表 > linux_设置定时器(C语言)-alarm函数-time命令-settimer函数

linux_设置定时器(C语言)-alarm函数-time命令-settimer函数

linux_设置定时器(C语言)-alarm函数-time命令-settimer函数

接上一篇:linux_信号-终端按键信号-硬件异常信号-kill函数-raise函数-abort函数

本次来分享linux的定时器,也就是alarm函数和settimer函数的调用,同时也介绍time的一种用法,开始上菜:

此博主在CSDN发布的文章目录:【我的CSDN目录,作为博主在CSDN上发布的文章类型导读】

目录

  • 1.alarm函数
    • 1.1.time命令
  • 2.setitimer函数

1.alarm函数

函数作用:
  设置定时器(闹钟)。在指定seconds后,内核会给当前进程发送14)SIGALRM信号。进程收到该信号,默认动作终止。
头文件:
  #include<unistd.h>
函数原型:
  unsigned int alarm(unsigned int seconds);
函数参数:
seconds:定时的秒
返回值:
  返回0或剩余的秒数,此时剩余的秒数是:距离第一次调用alarm函数后第二次调用alarm函数,上一次设定的seconds定时没有执行完的时间。假设你上一次定时5s,但是你的程序执行2s后又再次调用该函数,则本次调用的返回值就是上一次定时剩余的时间3s。
  无失败。
注:
  每个进程都有且只有唯一个定时器。
  常用:取消定时器alarm(0),返回旧闹钟余下秒数。
  定时,与进程状态无关(自然定时法)!就绪、运行、挂起(阻塞、暂停)、终止、僵尸…无论进程处于何种状态,alarm都计时。

例子-多次调用alarm函数:

#include <stdio.h>
#include <unistd.h>
int main(void)
{int h = alarm(31);//第一次调用sleep(1);h = alarm(5);//第二次调用printf("\\n\\n%d\\n",h);   //h = 30ssleep(2);h = alarm(52);//第三次调用printf("\\n\\n%d\\n",h);   //h = 3ssleep(2);h = alarm(5);//第四次调用printf("\\n\\n%d\\n",h);   //h = 50sreturn 0;
}

1.1.time命令

  使用time命令查看程序执行的时间。 程序运行的瓶颈在于IO,优化程序,首选优化IO(标准输入输出屏幕)。
例如:

time ./test1		#统计test1程序当前执行的时间
time ./test1 > out	#重定向,输出到out文件,这样比打印在屏幕上的效率更高

linux_设置定时器(C语言)-alarm函数-time命令-settimer函数
real:程序执行实际消耗的时间
user:程序运行在用户空间消耗的时间
sys:程序运行在内核空间消耗的时间

   实际执行时间 = 系统时间 + 用户时间 + 等待时间

2.setitimer函数

函数作用:
  设置定时器(闹钟)。 可代替alarm函数。精度微秒us,可以实现周期定时。
头文件:
  #include <sys/time.h>
函数原型:
  int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
函数参数:
which:指定定时方式
   ① 自然定时:ITIMER_REAL → 14)SIGLARM 计算自然时间
   ② 虚拟空间计时(用户空间):ITIMER_VIRTUAL → 26)SIGVTALRM 只计算进程占用cpu的时间
   ③ 运行时计时(用户+内核):ITIMER_PROF → 27)SIGPROF 计算占用cpu及执行系统调用的时间
new_value:设置定时器的值
old_value:传出参数,可以将距离上一次定时器剩余的时间返回

struct itimerval 
{struct timeval it_interval; /* 周期计时器的间隔 */struct timeval it_value;    /* 下一次到期前的时间*/
};
struct timeval
{time_t      tv_sec;         /* 秒 */suseconds_t tv_usec;        /* 微妙*/
};

返回值:
  成功:0;
  失败:-1,设置errno
例子–程序1s能数多少个数:

#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <stdlib.h>
unsigned int myalarm(unsigned int sec)
{struct itimerval it, oldit;int ret;it.it_value.tv_sec = sec;it.it_value.tv_usec = 0;it.it_interval.tv_sec = 0;it.it_interval.tv_usec = 0;//设置定时ret = setitimer(ITIMER_REAL, &it, &oldit);if (ret == -1) {perror("setitimer");exit(1);}return oldit.it_value.tv_sec;
}
int main(void)
{int i;myalarm(1);//循环1s,程序数数for(i = 0; ; i++){printf("%d\\n", i);}return 0;
}

以上就是本次的分享了,希望对大家有所帮助,欢迎大家讨论学习。