導航:首頁 > 操作系統 > linuxsleep喚醒

linuxsleep喚醒

發布時間:2022-07-30 03:41:35

linux如何實現睡眠喚醒按鍵,使得系統睡眠喚醒

❷ linux中的sleep怎麼用

sleep函數: #include <unistd.h> unsigned int sleep(unsigned int seconds); 此函數使調用進程被掛起,直到滿足以下條件之一: 1)已經過了seconds所指定的牆上時鍾時間 2)調用進程捕捉到一個信號並從信號處理程序返回 註:由於其他系統活動,實際返回時間比所要求的會遲一些,像alarm一樣。 sleep的返回值: 1)在上述第一種情形中,返回值是0 2)當由於捕捉到某個信號sleep提前返回時,返回值是未睡夠的時間(所要求的時間減去實際休眠時間) 看看下面的例子,猜猜sleep()的返回值是多少 1 #include <stdio.h> 2 #include <time.h> 3 #include <signal.h> 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 <unistd.h> unsigned int alarm(unsigned int senconds); 使用alarm函數可以設置一個計時器,在將來某個指定的時間該計時器會超時。當計時器超時時,產生SIGALARM信號。如果不捕捉或不忽略此信號,則其默認動作是終止調用該alarm函數的進程。 每個進程只能有一個鬧鍾時鍾,如果在調用alarm時,已經為該進程設置過鬧鍾時鍾,而且它還沒有超時,則將該鬧鍾時鍾的余留值作為本次alarm函數調用的返回值。以前登記的鬧鍾時鍾將被新值代替。 如果有以前為進程登記的尚未超過的鬧鍾時鍾,而且本次調用的seconds為0,則取消以前的鬧鍾時鍾,其餘留值仍作為alarm的返回值。 (以上這幾段話摘自《unix環境高級編程》)。 所以在while循環的printf("...\n");後面添加一句alarm(0);就可以滿足我的要求,即在...後再sleep 30s然後再進入循環。

❸ linux中如何實現sleep(0)的功能

前段時間從windows移植了一個程序到linux上,不知為何性能奇差。查了下原因,發現是由於一個函數ZeroSleep特別耗時,這個函數的代碼很簡單,如下:
void ZeroSleep()
{
Sleep(0);
}
Sleep(0)作用是用來釋放cpu的時間片,避免忙等待。於是想當然的在linux上實現為:
void ZeroSleep()
{
msleep(0);
}
但其實msleep API的源代碼如下:
void msleep(unsigned int msecs)
{
unsigned long timeout = msecs_to_jiffies(msecs) + 1;
while (timeout)
timeout = schele_timeout_uninterruptible(timeout);
}
如此一來,即使參數為0,也至少要睡眠一個jiffies單位的時間,因此導致嚴重的性能問題。
該問題的解決方法是:
既然ZeroSleep的目的是釋放cpu資源,那麼就可以通過調用schele()函數替換msleep 。而且實際上msleep本身也是通過調用schele_timeout_uninterruptible實現的,所以這個做法也是合理的。
http://tassardge.blog.163.com/blog/static/17230170820100275580656/

❹ Linux下的sleep函數 要用的話得包涵什麼頭文件啊

Linux下的sleep函數要用的話得需要#include <unistd.h>

sleep把進程的運行狀態改為睡眠,將其從系統可執行隊列去掉,這樣系統就不會調度到該進程,不會分配CPU時間片,同時根據該進程的睡眠時間,將進程掛入相應的定時器隊列中。

同時內核維持一個定時器隊列,每一次時鍾中斷處理,都把當前到期的隊列中的進程喚醒,加入到可運行進程隊列中。 同時對所有掛入定時器隊列中的進程時間值減1。

參考代碼:

#include<stdio.h>

#include<unistd.h>

intmain()

{

int sec=0,

usec=0;

while(1)

{

printf("sec=%d ",++sec);

sleep(1);

printf("usec=%d ",++usec);

usleep(1000000);

}

return0;

}

(4)linuxsleep喚醒擴展閱讀:

在Linux下,sleep中的「s」不大寫

sleep()單位為秒,usleep()裡面的單位是微秒。在內核中,sleep的實現是由pause函數和alarm函數兩個實現的。

特別注意在Codeblocks環境下是無法使用sleep函數的,因為在windows上Codeblocks採用mingw(Gnu在Window環境下的編譯器,可以充分使用WindowsApi)作為編譯器,而在stdlib.h中sleep的說明如下:_CRTIMP void __cdecl __MINGW_NOTHROW _sleep (unsigned long) __MINGW_ATTRIB_DEPRECATED;可以認為mingw舍棄了sleep函數,建議用Sleep實現sleep。

❺ linux的sleep函數有什麼用

sleep把進程的運行狀態改為睡眠,將其從系統可執行隊列去掉,這樣系統就不會調度到該進程,不會分配CPU時間片。同時根據該進程的睡眠時間,將進程掛入相應的定時器隊列中。
同時內核維持一個定時器隊列,每一次時鍾中斷處理,都把當前到期的隊列中的進程喚醒,加入到可運行進程隊列中。 同時對所有掛入定時器隊列中的進程時間值減1,

[cpp] view plain
clock_t start=clock();
sleep(5);
clock_t end=clock();
float time=(float)(end-start)/CLOCKS_PER_SEC;
printf("Sleep clock:%f\n",time);
首先獲取當前系統滴答數A,然後再加上需要sleep的時長結合CPU時鍾頻率計算得到的滴答數B。再來一個while循環,循環體中不停獲取當前滴答數,大於(A+B)時跳出循環,函數返回。

❻ 請教Linux下的sleep函數

函數名: sleep、usleep
功 能: 執行掛起一段時間
頭文件: #include <unistd.h>
區 別: unsigned sleep (unsigned int seconds);//n秒
int usleep (useconds_t usec);//n微秒

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

#include<stdio.h>
#include<unistd.h>
int main()
{
int sec = 0,
usec = 0;
while(1)
{
printf("sec = %d \n",++sec);
sleep(1);
printf("usec = %d \n",++usec);
usleep(1000000);
}
return 0;
}

Linux下的sleep函數原型為:
unsigned int sleep(unsigned int seconds);
而MFC中的Sleep函數原型為:
void Sleep(DWORD dwMilliseconds);
也就是說,Linux下(使用的gcc的庫),sleep()函數是以秒為單位的,sleep(1);就是休眠1秒。而MFC下的Sleep()函數是以毫秒為單位的,sleep(1000);才是休眠1秒。而如果在Linux下也用微妙為單位休眠,可以使用線程休眠函數:void usleep(unsigned long usec)。
Linux下還有個delay()函數,原型為extern void delay(unsigned int msec);它可以延時msec*4毫秒,也就是如果想延時一秒鍾的話,可以這么用 delay(250)。

❼ 請問Linux的休眠和喚醒線程...

通過信號實現。 sleep函數是通過鬧鍾信號實現的,在不同的LINUX版本中實現有差異。

❽ 如何在Linux系統里使用sleep函數

sleep通常用在循環中讓程序掛起等時間過了再繼續往下執行
可以用 man 3 sleep 可以看到頭文件和幫助

❾ sleep休眠怎麼喚醒 linux

sleep命令 
常用工具命令 sleep命令暫停指定的時間。 
語法 
sleep(參數) 
參數 
時間:指定要暫停時間的長度。 
時間長度,後面可接 s、m、h 或 d,其中 s 為秒,m 為 分鍾,h 為小時,d 為日數。 實例 有時在寫一些以循環方式運行的監控腳本,設置時間間隔是必不可少的,下面是一個Shell進度條的腳本演示在腳本中生成延時。 
#!/bin/bash 
b='' for ((i=0;$i<=100;i++)) do printf "Progress:[%-100s]%d%%\r" $b $i sleep 0.1 b=#$b done

❿ linux下的sleep函數

您好,
請在printf的字串後加換行符

{printf("%d \n",i); sleep(1); }

printf是行緩沖列印,它有一個buf,buf滿或遇\n,列印輸出
請採納為最佳答案,謝謝

閱讀全文

與linuxsleep喚醒相關的資料

熱點內容
linuxlostfound 瀏覽:124
征途伺服器ip地址 瀏覽:322
git提交代碼命令行 瀏覽:159
什麼叫瀏覽器伺服器結構 瀏覽:153
於謙聊天哪個app 瀏覽:447
小鵬汽車nlp演算法工程師薪資 瀏覽:879
代碼加密與隱藏 瀏覽:647
fordfulkerson演算法 瀏覽:350
京東熱app在哪裡可以下載 瀏覽:874
彩報圖書app哪個好 瀏覽:301
新君威20壓縮比 瀏覽:186
手機php整站 瀏覽:915
windows路由跳轉命令 瀏覽:472
量子遺傳演算法程序 瀏覽:222
各編程語言自帶軟體庫 瀏覽:184
編程最少學習多少 瀏覽:403
禪海蠡測語譯pdf 瀏覽:189
伺服器如何設置主城領地 瀏覽:122
android後台發送簡訊 瀏覽:5
mql4編程下載 瀏覽:954