1. 程式人生 > >sleep()封裝函式

sleep()封裝函式

    最近在做專案中,由於對sleep() 函式及其封裝函式掌握不透徹,導致本來延時10s,結果延時10ms,導致功能概論出現異常;現將linux sleep() 函式總結如下:

1. windows下sleep的引數為毫秒 ,所以sleep(1000) 代表延遲1秒;

    Linux下 sleep的引數為秒,所以延遲1秒為 sleep(1);

2. 相關函式:signal, alarm

標頭檔案:#include<stdio.h>

定義函式:unsigned int sleep(unsigned int seconds);

函式說明:sleep()會令目前的程序暫停, 直到達到引數seconds 所指定的時間, 或是被訊號所中斷.

返回值:若程序/執行緒掛起到引數所指定的時間則返回0,若有訊號中斷則返回剩餘秒數。

如果需要更精確可以用usleep單位為微秒

執行緒休眠函式:void usleep(unsigned long usec);

linux下delay()函式:

    原型為extern void delay(unsigned int msec); 它可以延時msec*4毫秒,也就是如果想延時一秒鐘的話,可以這麼用 delay(250);

    綜上所述:sleep,類似使當前程序睡眠,即就是將程序掛起,不再佔用CPU(自動放棄CPU)。 這裡sleep是為了讓子程序在父程序之後執行,試想如果子程序先執行完了,父程序就會永遠阻塞在waitpid函式,等待那個已經結束的子程序。

在linux程式設計中,定時功能,常見的是用sleep(time)函式來睡眠time秒;但是這個函式是可以被中斷的,也就是說當程序在睡眠的過程中,如果被中斷,那麼當中斷結束回來再執行該程序的時候,該程序會從sleep函式的下一條語句執行;這樣的話就不會睡眠time秒了;

例項如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

#include<stdio.h>

#include <stdlib.h>

#include <signal.h>

#include <unistd.h>

void sig_handler(int num)

{

printf("\nrecvive the signal is %d\n", num);

}

int main()

{

int time = 20;

signal(SIGINT, sig_handler);

printf("enter to the sleep.\n");

sleep(time);  

printf("sleep is over, main over.\n");

exit(0);

}

從執行結果可以看出,當我按下Ctrl+c發出中斷的時候,被該函式捕獲,當處理完該訊號之後,函式直接執行sleep下面的語句;備註:sleep(time)返回值是睡眠剩下的時間;

下面的例子是真正的睡眠time時間(不被中斷影響):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

/*************************************************************************

> File Name: sleep.c

> Author:

> Mail:

> Created Time: 2015年11月20日 星期五 20時38分59秒

************************************************************************/

#include<stdio.h>

#include <stdlib.h>

#include <signal.h>

#include <unistd.h>

void sig_handler(int num)

{

printf("\nrecvive the signal is %d\n", num);

}

int main()

{

int time = 20;

signal(SIGINT, sig_handler);

printf("enter to the sleep.\n");

//sleep(time);

do{

time = sleep(time);

}while(time > 0);

printf("sleep is over, main over.\n");

exit(0);

}

備註:其中recevie the signal is 2.表示該訊號是中斷訊號;訊號的具體值如下圖所示:

最後是sleep函式的man手冊,命令為:man 3 sleep