第十章 訊號(十九) sleep函式

2021-07-09 13:29:59 字數 1283 閱讀 5777

我們已經在本文許多例子裡使用了sleep函式,並在10.10節給出兩個有缺陷的實現。

#include

unsigned int sleep(unsigned int seconds)

;返回0或未睡眠的秒數。

這個函式導致呼叫程序被掛起,直到下面某種情況發生:

1、seconds指定的掛鐘時間量已經逝去;

2、程序捕獲乙個訊號而訊號處理器返回。

和alarm訊號一樣,真實的返回可能比所請求的更晚,因為其它系統活動。

在第一種情況,返回值為0。當sleep因為訊號**獲(第二種情況)而更早返回時,返回值是未睡眠的秒數(請求的時間減去真實睡眠的時間)。

盡 管sleep可以用alarm函式實現(10.10節),但是這並不是必需的。如果alarm被使用,在這兩個函式之間可能會有互動。posix.1標準 沒有規定這些互動。例如,如果我們執行乙個alarm(10)並在3秒掛鐘時間後執行乙個sleep(5),會發生什麼呢?sleep會在5秒返回(假定 這時沒有其它訊號**獲),但是另乙個sigalrm訊號會在2秒後產生嗎?這些細節取決於實現。

solaris 9用alarm實現sleep。solaris sleep手冊頁說前乙個排程好的鬧鐘被恰當處理。例如,在前乙個場景裡,在sleep返回前,它將重新排程鬧鐘,使它在2秒後發生;sleep在這種情 況下返回0。(顯然,sleep必須為sigalrm儲存訊號處理器的位址並在返回前重置它。)還有,如果我們執行乙個alarm(6)而3秒後執行乙個 sleep(5),sleep在3秒後返回(此時鬧鐘到時),而不是5秒後。這裡,sleep的返回值是2(未睡眠的秒數)。

另一方面,freebsd、linux、mac os x使用另一種技術:延遲由nanosleep提供。這個函式被規定為高精度的延遲,由sus的實現擴充套件提供。這個函式允許sleep的實現與訊號無關。

下面的**展示了posix.1 sleep函式的乙個實現。這個函式是10.10節裡的乙個修改,它可靠地處理訊號,避免早先實現的競爭條件。我們仍然不處理任何與之前設定的鬧鐘之間的互動。(正如我們提到的,這些互動沒有定義在posix.1裡。)

#include

static void

sig_alrm(

int signo)

unsigned int

sleep(unsigned int nsecs)

要寫這個可靠的實現比早先要花費更多的**。我們不使用任何形式的非本地分支(之前我們用它來避免alarm和pause之間發生的競爭條件),所以對其它當sigalrm被處理時可能正執行的訊號處理器沒有效果。

0 給主人留下些什麼吧!~~

APUE第十章 訊號

同步 乙個程序在執行某個請求的時候,若該請求需要一段時間才能返回資訊,那麼這個程序將會一直等待下去,直到搜到返回資訊才繼續執行。非同步 乙個程序在執行某個請求的時候,不需要一直等下去,而是繼續執行之後的操作,有訊息返回時系統會通知程序進行處理。同步和非同步關注的是程序之間的訊息通訊機制,區別阻塞和非...

第十章 函式

使用def關鍵字 定義個數可變的位置形參 定義個數可變的關鍵字形參 定義預設值引數 定義個數可變的位置形參 deffun1 args 結果為乙個元組 print args fun1 10,20,30 10,20,30 定義個數可變的關鍵字形參 deffun2 args 結果為乙個字典 print a...

第十章 屬性

z屬性 本章也比較簡單稍作介紹 無參屬性就是我們常見的屬性 可以封裝屬性 以執行緒安全方式訪問 有參屬性就是c 中的所引器 匿名型別 如圖遇到如下 具體點就是 上面的注釋也已經講清楚了,定義的型別之後,構造例項,然後初始化屬性。現在詳細說下 編譯器接收到 上圖 先用var 定義乙個型別,但是不具體指...