alarm()和pause()函数的应用
 
   alarm 
  
 
   
    
   unsigned 
   int
    alarm(unsigned 
   int
    seconds); 
  
 
   
   alarm函数是设置一个计时器, 在计时器超时的时候, 产生SIGALRM信号. 如果不忽略或捕捉此信号, 它的默认操作是终止调用该alarm函数的进程. 
  
 
   
    alarm的返回值是无符号整型, 每个进程只能有一个alarm维护的"闹钟". 
   
 
    
    如果该"闹钟"顺利超时, 则返回0; 
   
 
    
    如果该"闹钟"在计时过程中, 调用了另一个alarm函数, 则该"闹钟"的余留秒数作为该次alarm的返回值, 并且新的"闹钟"开始计时.(实际上是新的闹钟替代了以前的闹钟) 
   
 
    
   pause 
  
 
   
   int pause(void); 
  
 
   
   pause函数将进程挂起,直到捕捉到一个信号 
  
 
  
     #include <stdio.h> 
     
#include <unistd.h>
#include <signal.h>
 
     
static void my_signal_alarm(unsigned int signo)
{
printf( "my_signal_alarm\n");
return;
}
unsigned int my_sleep(unsigned int sleep_secs)
{
if (signal(SIGALRM,my_signal_alarm) == SIG_ERR)
return(sleep_secs);
alarm(sleep_secs);
// pause();
printf( "my_sleep\n");
return( alarm(0) ); //关闭上一次的时钟 并返回上次剩余的秒数
}
int main()
{
int ret;
ret=my_sleep(3);
printf( "ret=%d\n",ret);
return 0;
}
 
   #include <unistd.h>
#include <signal.h>
static void my_signal_alarm(unsigned int signo)
{
printf( "my_signal_alarm\n");
return;
}
unsigned int my_sleep(unsigned int sleep_secs)
{
if (signal(SIGALRM,my_signal_alarm) == SIG_ERR)
return(sleep_secs);
alarm(sleep_secs);
// pause();
printf( "my_sleep\n");
return( alarm(0) ); //关闭上一次的时钟 并返回上次剩余的秒数
}
int main()
{
int ret;
ret=my_sleep(3);
printf( "ret=%d\n",ret);
return 0;
}
 
   所以呢,留着这个pause还是有用的 
  
 
   
   另外补充,如果只有alarm和pause,即: 
  
 
  
     #include <stdio.h> 
     
#include <signal.h>
#include <unistd.h>
 
     
int main()
{
alarm(3);
pause();
printf( "end\n");
return 0;
}
 
   #include <signal.h>
#include <unistd.h>
int main()
{
alarm(3);
pause();
printf( "end\n");
return 0;
}
 
   补充:被pause的进程,不再响应SIGTERM等许多信号,唯一能够保证杀死进程的方法就是使用kill命令向该进程发送SIGKILL信号。 
  
 
   
   从该例可以看出,SIGALRM信号还是响应的