3 软件条件
当满足某种软件条件时,也可以驱使内核发送信号。
alarm
setitimer
3.1 alarm函数
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
函数功能:
- 相当于计时器,驱使内核在指定秒数后发送信号到调用该函数的进程。
参数说明:
- seconds:以秒为单位,整数
返回值:
- 若进程不是第一次调用alarm,且上一个alarm尚有剩余秒数,则该函数成功调用后返回旧计时器的剩余秒数,否则返回0。
【案例 1】在程序中设置计时器,使进程在指定秒数后终止运行。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main() {alarm(1);while(1){printf("Process will finish!");}//of whilereturn 0;
}//of main
3.2 setitimer函数
#include <sys/time.h>
int setitimer(int which, const struct itimerval * new_value, struct itimerval * old_value);
struct itimerval{struct timeval it_interval; //间隔时间struct timeval it_value; //初始定时时间
};
struct timeval{long tv_sec; //秒long tv_usec; //微秒
};
函数功能:
- 设置定时器,精确到微秒,比alarm精度更高,并且可以实现周期定时。
参数说明:
- which:以何种方式计时:
– ITIMER_REAL:自然定时法计时,计算自然流逝的时间,计时结束递送14号信号SIGALRM;
– ITIMER_VIRTUAL:只计算进程占用CPU的时间,计时结束递送26号信号SIGVTALAM;
– ITIMER_PROF:计算进程占用CPU及执行系统调用的时间,即进程在用户空间和内核空间运行时间的总和,计时结束递送27号信号SIGPROF。 - new_value:一个itimerval类型的指针,表示计时器定时时长:
– 若只指定it_value,则只实现一次定时;
– 若同时指定it_interval,则可实现重复定时;
– setitimer工作机制是,先对it_value倒计时,当it_value计时结束时,触发信号发送条件。然后重置it_value为it_interval,继续对it_value倒计时,如此一直循环。 - old_value:用来保存先前设置的new_value,通常设置为NULL。
返回值:
- 0:成功调用;
- -1:调用失败并设置errno。
【案例 2】使用setitimer实现alarm函数。
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <error.h>unsigned int my_alarm(unsigned int paraSec) {struct itimerval tempIt, tempOldIt;int tempRet;tempIt.it_value.tv_sec = paraSec;tempIt.it_value.tv_usec = 0;tempIt.it_interval.tv_sec = 0;tempIt.it_interval.tv_usec = 0;tempRet = setitimer(ITIMER_REAL, &tempIt, &tempOldIt);if(tempRet == 1){perror("setitimer");exit(1);}//of ifreturn tempOldIt.it_value.tv_sec;
}//of my_alarmint main(){my_alarm(1);while(1){printf("Process will finish!");}//of whilereturn 0;
}//of main