是否有人關注sleep()
和alarm()
的組合?我一直聽說這樣做很糟糕,因爲他們都可能依靠同一個計時器並相互衝突。在linux中報警和睡眠
我覺得用alarm()
很容易出現錯誤,希望看到不同的解決方案或任何想法,這樣我可以從我的代碼與睡眠多兼容的東西刪除報警。
是否有人關注sleep()
和alarm()
的組合?我一直聽說這樣做很糟糕,因爲他們都可能依靠同一個計時器並相互衝突。在linux中報警和睡眠
我覺得用alarm()
很容易出現錯誤,希望看到不同的解決方案或任何想法,這樣我可以從我的代碼與睡眠多兼容的東西刪除報警。
當您使用sleep
時,進程進入休眠狀態的時間以毫秒爲單位,alarm
將返回sleep
後的剩餘秒數。 alarm
在提到的時間量之後終止該過程。
是的,sleep
和alarm
將使用相同的計時器。因此,我們有責任在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秒後終止。
是的,我可以理解..但這件事會變得複雜。你有什麼想法,以便我可以從我的代碼中刪除與睡眠兼容的警報。 – user2814189
混合sleep
和alarm
存在多種可能的兼容性問題。
第一個是sleep
將被信號中斷,如alarm
的信號。所以你總是必須檢查你的sleep
是否真的睡了你想要的時間。
但第二個潛在的更大的問題是,在某些系統sleep
可能在內部,就像這樣實現的:alarm(s); pause();
沒有正確復位以前alarm
這實際上意味着sleep
會破壞你可能已設置的任何報警。
如果您的功能實際上取決於是否能夠睡眠並獲得相互獨立的警報,請查看使用setitimer
設置自己的定時器,並圍繞此構建自己的定時框架。當進入睡眠狀態時,將itimer設置爲睡眠時間長度並且pause()
(檢查您是否被其他信號提前喚醒),然後將計時器設置回任何警報。
是的,我可以使用setitimer來取代alarm.but但我認爲setitimer,鬧鐘,睡眠屬於同一類別,有時會給出未定義的行爲。但setitimer有三個選項來設置計時器,如TIMER_REAL,TIMER_PROF,TIMER_VIRTUAL.Does任何人更兼容睡眠。 – user2814189
嗯,我的意思是用你自己的東西在setitimer周圍滾動來代替警報和睡眠。不只是其中之一。 – Art
@藝術......同意..但我不想觸摸sleep.It將是很忙碌的,以取代我的代碼中的所有睡眠。對我來說,將很容易替換alarm.As每根據我的觀察,我可以使用Timer_create (爲特定進程創建計時器)。但是我發現它有很多複雜性,請您有其他建議。 – user2814189
我認爲使用alarm()很容易出錯,並希望看到不同的解決方案或任何想法,這樣我就可以從我的代碼中刪除與睡眠兼容的警報。
sleep()
使用SIGALRM
實施,nanosleep()
是不是,所以我建議用nanosleep()
更換sleep()
。
在這個階段,我無法用nanosleep取代睡眠。你有什麼想法來取代警報。 – user2814189
@ user2814189您可以使用庫插入將'sleep()'替換爲'nanosleep()'。或者,用'setitimer()'重新實現'alarm()'。一個更好的方法是避免將這兩個函數放在一起,因爲它們不能很好地與線程交互。 –
..因爲sleep()和setitimer()都是用SIGALRM實現的,所以替換是無益的。除了setitimer()之外,還有其他建議嗎?術語庫插入對我來說是未知的。 – user2814189
閱讀time(7)手冊頁。
最近的Linux還提供poll(2)(和ppoll(2)
和select(2)
和pselect(2)
...),clock_gettime(2),timer_create(2),timerfd_create(2),signalfd(2),eventfd(2),nanosleep(2) ...
你試過了嗎?你有什麼看法? – HAL
我已經在我的代碼中使用了這些東西..它正在爲我工作..但有時它有未定義的行爲..我想用timer_create或setitimer或任何東西去除鬧鐘..我的意思是我不知道什麼將是有效的。 – user2814189
@HAL在這種情況下,嘗試它並不是真正的好方法,因爲它依賴於系統。他可能很幸運,他的系統不會發生衝突。然後試圖給出錯誤的結論。 – Art