Chinaunix首页 | 论坛 | 博客
  • 博客访问: 39954
  • 博文数量: 17
  • 博客积分: 750
  • 博客等级: 军士长
  • 技术积分: 160
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-19 17:39
文章分类
文章存档

2009年(17)

我的朋友

分类: LINUX

2009-11-04 20:12:28

#include
unsigned int alarm(unsigned int seconds);
系 统调用alarm安排内核为调用进程在指定的seconds秒后发出一个SIGALRM的信号。默认动作是终止调用进程,可以捕获信号在超时后执行我们用signal设定的信号处理函数。后一次设定将取消前一次的设定。如果指定的参数seconds为0,则不再发送 SIGALRM信号,所以可用参数0取消先前设置的alarm定时器。该调用返回值为上次定时调用到发送之间剩余的时间,或者因为没有前一次定时调用而返回0。
注意,在使用时,alarm只设定为发送一次信号,如果要多次发送,就要多次使用alarm调用。 alarm不挂起调用进程。有时需要调用alarm后使进程挂起,这时可以在调用pause函数,该函数使进程休眠,直到接收到一个信号(任何信号)并从信号处理程序返回时才唤醒进程。
如果不要求很精确的话,用alarm()和signal()就够了。

void sigalrm_fn(int sig)
{    printf("alarm!\n");
    alarm(2);                        //alarm只设定为发送一次信号,如果要多次发送,就要多次使用alarm调用

    return;
}
int main(void)
{    signal(SIGALRM, sigalrm_fn);
    alarm(1);
    while(1) pause();
}

#include
unsigned int sleep(unsigned int seconds); 被中断返回未休眠够的秒数,超时到返回0
挂起调用进程,直到定时时间到或者捕捉到一个信号(此信号不能是被忽略的信号)并从信号处理程序返回。此函数一般用来使进程挂起指定时间,不能设定信号处理函数,所以不能用来超时后执行特定动作。一般不作为定时器。
#include
int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout);
如果函数的第2、3、4这三个指针参数均为null,则select提供了比select更精确的定时器,因为sleep等待整数秒,而struct timeval结构精确到毫秒。定时器将阻塞进程直到超时(返回0)或者被信号中断(返回-1)。此函数一般用来使进程挂起指定时间,不能设定信号处理函数,所以不能用来超时后执行特定动作。一般不作为定时器。
timeout参数指向的struct timeval结构不一定返回剩余的秒数,如果我们需要这个值,必须在调用select前取得系统时间,返回后再取得系统时间,两者相减。


#include
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);
setitimer()有两个功能,一是指定一段时间后,才执行某个function,二是每间格一段时间就执行某个function,setitimer() 为Linux的API,并非C语言的Standard Library
参数:
which:间歇计时器类型,有三种选择
ITIMER_REAL //数值为0, 以系统真实的时间来计算,计时器的值实时递减,发送的信号是SIGALRM。
ITIMER_VIRTUAL //数值为1,以该进程在用户态下花费的时间来计算,进程执行时递减计时器的值,发送的信号是SIGVTALRM。
ITIMER_PROF //数值为2, 以该进程在用户态下和内核态下所费的时间来计算,进程和系统执行时都递减计时器的值,发送的信号是SIGPROF。

value,ovalue:时间参数,原型如下
struct itimerval {
    struct timeval it_interval; /* 计时器重启动的间歇值 */
    struct timeval it_value;    /* 计时器安装后首先启动的初始值 */
};
struct timeval {
    long tv_sec;                /* 秒 */
    long tv_usec;               /* 微妙(1/1000000) */
};

int getitimer(int which, struct itimerval *value);//用计时器的当前值填写value指向的结构体。

20#include <stdio.h> // for printf()

21#include <unistd.h> // for pause()

22#include <signal.h> // for signal()

23#include <string.h> // for memset()

24#include <sys/time.h> // struct itimeral. setitimer()

25
26void printMsg(int);
27
28int main() {
29 // Get system call result to determine successful or failed

30 int res = 0;
31 // Register printMsg to SIGALRM

32 signal(SIGALRM, printMsg)

阅读(908) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~