一、alarm函数
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
功能:闹钟,当执行到该函数之后开始计时,超时时产生SIGALRM信号。如果不忽略或不捕捉此信号,则其默认动作是终止该进程
参数:
seconds的值是产生SIGALRM需要经过的时钟秒数
如果秒为零,则取消任何挂起的警报。在任何情况下,任何先前设置的报警都会被取消
返回值:
成功:第一次调用返回0,不是第一次调用返回以前设置的闹钟时间的余留秒数
失败:非0
注意事项:
当这一时刻达到时,信号由内核产生,由于进程调度的延迟,所以进程得到控制从而能够处理该信号还需要一定的时间间隔;
如果我们想要捕捉SIGALRM信号,并且处理SIGALRM信号,必须在alarm之前书写该信号的处理函数。
//案例
#include<signal.h>
#include<stdio.h>
int main(void)
{
printf("first time return:%d\n",alarm(4));
sleep(1);
printf("after sleep(1),remain:%d\n",alarm(2));
printf("renew alarm,remain:%d\n",alarm(1));
}
二、ualarm函数
#include <unistd.h>
useconds_t ualarm(useconds_t usecs, useconds_t interval);
/*在usecs微秒后,将SIGALRM信号发送给进程,并且之后每隔interval微秒再发送一次
SIGALRM信号。如果不对SIGALRM信号进程处理,默认操作是终止进程
返回值:此函数返回以前设置的任何警报的剩余微秒数。如果没有挂起警报,
则返回0(第一次调用该函数也返回0)。常见的errno如下:
EINTR:被一个信号打断了
EINVAL:usecs或interval不小于1000000(在被认为是错误的系统上)
*/
//案例
#include<unistd.h>
#include<signal.h>
#include<errno.h>
#include<stdio.h>
void handler()
{
printf("int:hello\n");
}
int main()
{
int i;
signal(SIGALRM,handler);
//因为是第一次设置,所以返回0
printf("%d\n",ualarm(500000,200000));
while(1)
pause();
return 0;
}
三、
#include <unistd.h>
int pause(void);
功能
pause使调用进程(或线程)休眠,直到接受到终止进程的信号,或者接收到信号并从信号捕获函数中返回时,pause才返回
返回值
pause仅在捕获信号并返回信号捕获函数时返回。在这种情况下,pause返回-1,errno设置为eintr