2013-09-25 31 views
0

是否有人關注sleep()alarm()的組合?我一直聽說這樣做很糟糕,因爲他們都可能依靠同一個計時器並相互衝突。在linux中報警和睡眠

我覺得用alarm()很容易出現錯誤,希望看到不同的解決方案或任何想法,這樣我可以從我的代碼與睡眠多兼容的東西刪除報警。

+1

你試過了嗎?你有什麼看法? – HAL

+0

我已經在我的代碼中使用了這些東西..它正在爲我工​​作..但有時它有未定義的行爲..我想用timer_create或setitimer或任何東西去除鬧鐘..我的意思是我不知道什麼將是有效的。 – user2814189

+1

@HAL在這種情況下,嘗試它並不是真正的好方法,因爲它依賴於系統。他可能很幸運,他的系統不會發生衝突。然後試圖給出錯誤的結論。 – Art

回答

2

當您使用sleep時,進程進入休眠狀態的時間以毫秒爲單位,alarm將返回sleep後的剩餘秒數。 alarm在提到的時間量之後終止該過程。

是的,sleepalarm將使用相同的計時器。因此,我們有責任在alarm()之後發生sleep()時計算剩餘秒數。

例如: 如果使用

alarm(5);---------------> An alarm is set for 5 seconds. 

sleep(3);---------------> Process goes to sleep state for 3 seconds. 

alarm(7);---------------> This alarm returns the seconds remaining after sleep is set i.e it returns 2. 

然後alarm設置爲7秒。當過程時間超過12秒時,過程在12秒後結束。

如果sleep時間較多,

實施例2:

alarm(5); 

sleep(7); 

然後,處理5秒後終止。

+0

是的,我可以理解..但這件事會變得複雜。你有什麼想法,以便我可以從我的代碼中刪除與睡眠兼容的警報。 – user2814189

0

混合sleepalarm存在多種可能的兼容性問題。

第一個是sleep將被信號中斷,如alarm的信號。所以你總是必須檢查你的sleep是否真的睡了你想要的時間。

但第二個潛在的更大的問題是,在某些系統sleep可能在內部,就像這樣實現的:alarm(s); pause();沒有正確復位以前alarm這實際上意味着sleep會破壞你可能已設置的任何報警。

如果您的功能實際上取決於是否能夠睡眠並獲得相互獨立的警報,請查看使用setitimer設置自己的定時器,並圍繞此構建自己的定時框架。當進入睡眠狀態時,將itimer設置爲睡眠時間長度並且pause()(檢查您是否被其他信號提前喚醒),然後將計時器設置回任何警報。

+0

是的,我可以使用setitimer來取代alarm.but但我認爲setitimer,鬧鐘,睡眠屬於同一類別,有時會給出未定義的行爲。但setitimer有三個選項來設置計時器,如TIMER_REAL,TIMER_PROF,TIMER_VIRTUAL.Does任何人更兼容睡眠。 – user2814189

+0

嗯,我的意思是用你自己的東西在setitimer周圍滾動來代替警報和睡眠。不只是其中之一。 – Art

+0

@藝術......同意..但我不想觸摸sleep.It將是很忙碌的,以取代我的代碼中的所有睡眠。對我來說,將很容易替換alarm.As每根據我的觀察,我可以使用Timer_create (爲特定進程創建計時器)。但是我發現它有很多複雜性,請您有其他建議。 – user2814189

0

我認爲使用alarm()很容易出錯,並希望看到不同的解決方案或任何想法,這樣我就可以從我的代碼中刪除與睡眠兼容的警報。

sleep()使用SIGALRM實施,nanosleep()是不是,所以我建議用nanosleep()更換sleep()

+0

在這個階段,我無法用nanosleep取代睡眠。你有什麼想法來取代警報。 – user2814189

+0

@ user2814189您可以使用庫插入將'sleep()'替換爲'nanosleep()'。或者,用'setitimer()'重新實現'alarm()'。一個更好的方法是避免將這兩個函數放在一起,因爲它們不能很好地與線程交互。 –

+0

..因爲sleep()和setitimer()都是用SIGALRM實現的,所以替換是無益的。除了setitimer()之外,還有其他建議嗎?術語庫插入對我來說是未知的。 – user2814189