linux延时函数 sleep,Linux中的sleep和alarm在延时作用中的区别和联系

sleep函数:

#include

unsigned int sleep(unsigned int seconds);

此函数使调用进程被挂起,直到满足以下条件之一:

1)已经过了seconds所指定的墙上时钟时间

2)调用进程捕捉到一个信号并从信号处理程序返回

注:由于其他系统活动,实际返回时间比所要求的会迟一些,像alarm一样。

sleep的返回值:

1)在上述第一种情形中,返回值是0

2)当由于捕捉到某个信号sleep提前返回时,返回值是未睡够的时间(所要求的时间减去实际休眠时间)

看看下面的例子,猜猜sleep()的返回值是多少

1 #include

2 #include

3 #include

4

5 #define DIAPAUSE 30    //sleep time 30s

6 #define TIMEOUT 5

7

8 void sigalrm(int signo);

9

10 int main()

11 {

12         struct sigaction sa;

13

14         sa.sa_handler = sigalrm;

15         sa.sa_flags = 0;

16         sigemptyset(&sa.sa_mask);

17         if(sigaction(SIGALRM, &sa, NULL) < 0)

18         {

19                 printf("sigaction error!\n");

20                 return;

21         }

22

23         while(1)

24         {

25                 printf("alarm(TIMEOUT)...\n");

26                 alarm(TIMEOUT);

27                 printf("...\n");

28                 printf("sleep(DIAPAUSE) == %d\n", sleep(DIAPAUSE));

29         }

30

31         return 0;

32 }

33

34 void sigalrm(int signo)

35 {

36         printf("timeout...\n");

37         return;

38 }

sleep函数的返回值是25。

如果将TIMEOUT的值改为大于DIAPAUSE的值,如50的话,sleep函数在睡够了DIAPAUSE后就会返回,返回值为0。

如果我们即需要alarm又需要sleep一个预订的事件怎么办?如上面的例子,我想在...后再sleep 30s然后再进入循环。这在socket通讯过程中,在设置超时的时候可能会用到。

注意到alarm函数。

#include

unsigned int alarm(unsigned int senconds);

使用alarm函数可以设置一个计时器,在将来某个指定的时间该计时器会超时。当计时器超时时,产生SIGALARM信号。如果不捕捉或不忽略此信号,则其默认动作是终止调用该alarm函数的进程。

每个进程只能有一个闹钟时钟,如果在调用alarm时,已经为该进程设置过闹钟时钟,而且它还没有超时,则将该闹钟时钟的余留值作为本次alarm函数调用的返回值。以前登记的闹钟时钟将被新值代替。

如果有以前为进程登记的尚未超过的闹钟时钟,而且本次调用的seconds为0,则取消以前的闹钟时钟,其余留值仍作为alarm的返回值。

(以上这几段话摘自《unix环境高级编程》)。

所以在while循环的printf("...\n");后面添加一句alarm(0);就可以满足我的要求,即在...后再sleep 30s然后再进入循环。0b1331709591d260c1c78e86d0c51c18.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值