/*signal_test.c*/
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
void timeout(int sig)
{
if(sig == SIGALRM)
puts("time out!);
alarm(2);
}
void keycontrol(int sig)
{
if(sig == SIGINT)
puts("CTRL+C pressed!);
}
int main(int argc, char *argv[])
{
int i;
signal(SIGALRM, timeout);<span style="white-space:pre"> </span>//可称为信号注册函数,表明在发生SIGALRM信号时,请求操作系统执行timeout函数
signal(SIGINT, keycontrol);<span style="white-space:pre"> </span>//可称为信号注册函数,表明在发生SIGINT信号时,请求操作系统执行keycontrol函数
alarm(2);<span style="white-space:pre"> </span>//调用alarm函数,2秒后产生SIGALRM信号
for(i = 0; i < 3; i++);
{
puts("wait...");
sleep(100);
}
return 0;
}
编译:gcc signal_test.c -o signal_test
运行:./signal_test
运行结果:
wait...
time out!
wait...
time out!
wait...
time out!
wait...
time out!
上述是没有任何输入时的运行结果,如果在程序运行过程中输入CTRL+C,则会输出“CTRL+C pressed”.
需要说明的是,发生信号时将唤醒由于调用sleep函数而进入阻塞状态的进程,而且,进程一旦被唤醒,就不会再进入睡眠状态,即使还未到sleep函数中规定的时间。