《Unix/Linux系统编程》第八周学习笔记
时钟服务函数
gettimeodfay() 获取系统时间
settimeofday() 设置系统时间
time() 以秒为单位返回当前时间
times() 获取进程执行时间
间隔定时器
gettitimer() 获取间隔定时器状态
setitimer()设置并创建定时器
三种模式
实践
gettimeofday()
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>
int main()
{
struct timeval t;
gettimeofday(&t,NULL);
printf("sec = %ld , usec = %d\n",t.tv_sec,t.tv_usec);
printf((char*)ctime(&t.tv_sec));
return 0;
}

settimeofday()
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>
int main()
{
struct timeval t;
t.tv_sec = 123456789;
t.tv_usec = 0;
int r = settimeofday(&t,NULL);
if(!r){
printf("settimeofdat() failed\n");
return -1;
}
gettimeofday(&t,NULL);
printf("sec = %ld , usec = %ld\n",t.tv_sec,t.tv_usec);
printf("%s",ctime(&t.tv_sec));
return 0;
}

time()
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
time_t start , end;
start = time(NULL);
printf("start = %ld\n",start);
for(int i=0;i<123456789;i++);
end = time(NULL);
printf("end = %ld\n",end);
printf("time = %ld\n",end-start);
return 0;
}

setitimer()
#include <signal.h>
#include <stdio.h>
#include <sys/time.h>
int count = 0;
struct itimerval t;
void timer_handler(int sig)
{
printf("timer_handler: signal=%d count=%d\n", sig, ++count);
if (count>=8)
{
printf("cancel timer\n");
t.it_value.tv_sec = 0;
t.it_value.tv_usec = 0;
setitimer(ITIMER_VIRTUAL, &t, NULL);
}
}
int main()
{
struct itimerval timer;
signal(SIGVTALRM, timer_handler);
timer.it_value.tv_sec = 0;
timer.it_value.tv_usec = 100000;
timer.it_interval.tv_sec = 1;
timer.it_interval.tv_usec = 0;
setitimer(ITIMER_VIRTUAL, &timer, NULL);
printf("looping: enter Control-C to terminate\n");
while(1);
}

问题
- 中断是如何实现的?
中断的本质是处理器对外开放的实时受控接口。
一个没有中断的计算机体系是决定论的:得知某个时刻CPU和内存的全部数据状态,就可以推衍出未来的全部过程。这样的计算机无法交互,只是个加速器。
添加中断后,计算机指定了会兼容哪些外部命令,并设定服务程序,这种服务可能打断当前任务。这使得CPU“正在执行的程序”与“随时可能发生的服务”,二者形成了异步关系,外界输入的引入使得计算机程序不再是决定论。由人实时控制的中断输入,是无法预测的。再将中断响应规则化,推广开,非计算机科学人群就能控制计算机,发挥创造力。
既然硬件能干扰到CPU的正常的指令执行,那么CPU就必须能感知到干扰信号,所谓的干扰信号就是这里所说的中断信号。
CPU的工作粒度是机器指令级别,那么在每条机器指令执行结束后都会检查一下是否中断信号产生。
这里的实现可能是轮询。这就好比你在玩游戏,此时如果有人喊你的名字(中断信号)干扰你玩游戏那么你立刻就能听到
但人的大脑里有一直在轮询“有没有人喊我的名字?有没有人喊我的名字?有没有人喊我的名字?”了吗?并没有。人脑的中断检查机制是及其高效的。
CPU的硬件特性决定中断处理机制也及其高效。
当那个管脚电平变低(或者变高)的时候,cpu就会被打断,并从特定地址开始执行。
就像cpu的reset被拉低的时候一定会复位并从0地址开始执行一样,都是硬件的结构决定的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通