NOTE:部分文字说明出自《UNIX环境高级编程》
1. alarm函数
每个进程只能有一个闹钟时钟。如果在调用alarm时,以前已为该进程设置过时钟,而且它还没超时,则将该闹钟的余值作为本次alarm函数调用的值返回。以前登记的时钟则被新值代替。如果闹钟到时,默认操作为终止该进程,但是大多数进程会捕捉该信号然后进行相应的处理。
代码说明1:
#include "unistd.h"
#include "stdio.h"
int main()
{
int ret = 0;
int alarm_num = 10,sleep_num = 3;
printf("Begin to first count alarm %d seconds.\n",alarm_num);
ret = alarm(alarm_num);
printf("Begin to sleep count %d seconds.\n",sleep_num);
sleep(sleep_num);
printf("End sleep,first_ret = %d\n",ret);
alarm_num = 2;
printf("Begin to second count alarm %d seconds.\n",alarm_num);
ret = alarm(alarm_num); //重新赋值给闹钟2秒
printf("second ret = %d\n",ret);
while(1);
return 0;
}
编译:
[elbort@elbort test1]$ gcc -Wall -o test test.c
结果显示:
[elbort@elbort test1]$ ./test
Begin to first count alarm 10 seconds.
Begin to sleep count 3 seconds.
End sleep,first_ret = 0
Begin to second count alarm 2 seconds.
second ret = 7 //重新给闹钟赋值前,闹钟运行了3秒,所以返回值为10-3=7。
注意:这里等了两秒
闹钟 //闹钟到时,默认终止该进程
[elbort@elbort test1]$
代码说明2:添加对闹钟信号处理
#include "unistd.h"
#include "stdio.h"
#include "signal.h"
#include "stdlib.h"
void sig_alrm()
{
printf("catch a alarm signal!\n");
exit(0);
}
int main()
{
int ret = 0;
int alarm_num = 10,sleep_num = 3;
signal(SIGALRM,sig_alrm);
printf("Begin to first count alarm %d seconds.\n",alarm_num);
ret = alarm(alarm_num);
printf("Begin to sleep cont %d seconds.\n",sleep_num);
sleep(sleep_num);
printf("End sleep,first_ret = %d\n",ret);
alarm_num = 2;
printf("Begin to second count alarm %d seconds.\n",alarm_num);
ret = alarm(alarm_num);
printf("second ret = %d\n",ret);
while(1);
return 0;
}
运行结果:
[elbort@elbort test1]$ ./test
Begin to first count alarm 10 seconds.
Begin to sleep cont 3 seconds.
End sleep,first_ret = 0
Begin to second count alarm 2 seconds.
second ret = 7
catch a alarm signal! //进入获得闹钟信号处理函数
[elbort@elbort test1]$
如果有以前为进程登记的尚未超时的闹钟时钟,而且本次调用的seconds值是0,则取消以前的闹钟,其余值仍作为alarm函数的返回值。
代码说明:
#include "unistd.h"
#include "stdio.h"
int main()
{
int ret;
ret = alarm(8);
printf("First ret = %d\n",ret);
printf("Here sleep 2 seconds.\n");
sleep(2);
ret = alarm(0);
printf("Second ret = %d\n",ret);
printf("Here sleep 10 seconds.\n");
sleep(10);
printf("The alarm is cancle.The process don't catch the SIGALRM\n");
return 0;
}
运行结果:
[elbort@elbort test1]$ ./test1
First ret = 0
Here sleep 2 seconds.
Second ret = 6
Here sleep 10 seconds.
The alarm is cancle.The process don't catch the SIGALRM
[elbort@elbort test1]$
2.pause函数
2. pause函数:
pause函数使调用进程挂起, 直到捕捉到一个信号. 它的原型如下:
int pause();
返回 - 1 , 并将errno设置为EINTR.
这个函数很简单, 由字面意思就可以理解出来"暂停". pause只有在执行了一个信号处理程序并从其返回时, pause才返回.
代码说明:
#include "unistd.h"
#include "stdio.h"
#include "signal.h"
#include "stdlib.h"
#include <sys/types.h>
pid_t main_pid;
void sig_alrm()
{
printf("catch a alarm signal!\n");
kill(main_pid,SIGCONT);
}
int main()
{
int alarm_num = 5;
main_pid = getpid();
signal(SIGALRM,sig_alrm);
printf("Begin to count alarm %d seconds.\n",alarm_num);
alarm(alarm_num);
pause();
printf("main catch SIGCONT.\n");
return 0;
}
结果显示:
[elbort@elbort test1]$ ./h
Begin to count alarm 5 seconds.
catch a alarm signal!
main catch SIGCONT.
[elbort@elbort test1]$