在《Shell脚本实现键盘LED灯闪烁》一文中,我们已感受到了控制的乐趣,一步步向硬件逼近,这次我们在Linux下使用C语言进行系统调用来实现该功能。这里面会涉及到应用层定时器和ioctl系统调用来控制键盘LED灯状态。
关于应用层定时器需要涉及到信号机制,其包含有alarm闹钟和timer定时器两种,其与信号机制分别说明如下(这两种均是自动循环的,即不需要处理函数里再设置一遍定时器超时设置):
1.alarm
运行man alarm命令后有关于该函数的使用说明,其函数原型如下:#include
unsigned int alarm(unsigned int seconds);
当设定的时间到了后会发出SIGALRM信号,需要对应的信号处理函数配套处理。
2.timer
运行man setitimer命令后有相关说明,本次会用到的函数原型如下:#include
int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
其中which是设置的定时器类型,分别对应如下:ITIMER_REAL:实时定时器,发SIGALRM信号;
ITIMER_VIRTUAL:应用进程执行时间定时器,发SIGVTALRM信号;
ITIMER_PROF:应用进程执行和内核交互时间定时器,发SIGPROF信号。
从上面可以看出,同一时间只能有3个定时器存在,分别对应3种类型。那么上面的信号要如何处理呢?执行man signal命令有相关的函数原型