#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <sys/time.h>
unsigned int my_alarm(unsigned int seconds) {
struct itimerval new = { {0, 0},{seconds, 0} };
struct itimerval old ; // 传出参数,用于获得上一个闹钟的信息,体现在alarm函数的返回值上
setitimer(ITIMER_REAL,&new,&old);
// 注意:old 结构体包含 “ 秒+毫秒 ”
// 因此: 1s + 400000us 则应该返回 1s , 而 1s + 900000us 则应该返回 2s
// 如果直接返回 old.it_value.tv_sec 有问题,所以要涉及毫秒 “ 四舍五入” 的操作
int retval = old.it_value.tv_sec + (old.it_value.tv_usec + 500000)/1000000;
return retval;
}
int main()
{
unsigned int ret = my_alarm(5);
printf("%d\n", ret); // 结果:0
sleep(2);
ret = my_alarm(4);
printf("%d\n", ret); // 结果:3
return 0;
}
说明:while(1){ sleep(1) ; alarm(2)} 也可以实现 setitimer 功能