2012-09-02 81 views
1

我有一個函數正在一個單獨的隊列/線程上運行。在這個函數中,我試圖撥打usleep爲什麼不睡覺?

無論傳入的值如何,usleep似乎都不起作用。 sleep()也是如此。

爲了診斷錯誤,我打印出errnoerrno打印爲:「中斷系統調用」

這是什麼意思,我怎麼去診斷它呢?

的手冊頁描述錯誤爲:

[EINTR]   A signal was delivered to the process and its action was to invoke a signal-catching 
        function. 

注意我使用的Xcode 4和使用Objective-C OSX山獅。我正在開發一個使用Cocoa的OSX應用程序。

回答

0

您不能隨時打印errno並期望它有用。它是一個per-thread變量,只有在特定的系統調用設置後才能設置。

I.e.當您確定呼叫失敗時,您只能檢查errno

這是非常不可能的,任何一個呼叫失敗。極不可能。


從您的問題中不清楚您是否獲得了返回值。

  • 在調試器之外嘗試它,它可能是調試器將事物帶有信號。如果是這樣,這可能是一個錯誤。

  • 你有任何其他信號重碼或子系統在使用嗎?一般來說,信號處理程序在Unix系統上很麻煩。

  • 你在使用lldb嗎?你有嘗試切換到gdb嗎?

+0

我知道在檢查完成。但在這種情況下,通話*確實失敗。失敗時,usleep()返回-1。我檢查了返回的值;其-1。 – fdh

+0

你的問題,如措辭,並不表示。很公平。 – bbum

+0

我在調試器外面試過了,但是我仍然得到一個相同的錯誤。我沒有任何信號重碼,我正在使用gdb。 – fdh

4

usleepsleep可以以這種方式通過信號傳送被中斷。

沒有專用的信號傳輸線程,所以信號可以傳送到應用程序中的任意線程。

注意原來的答覆左下方不正常工作的山獅 - 別的東西的時候下的XCode運行時觸發EINTR。

爲了避免這個問題,我們換到nanosleep,並使用時,它被中斷返回第二個參數的剩餘時間的事實:

struct timespec to_sleep = { 1, 0 }; // Sleep for 1 second 
while ((nanosleep(&to_sleep, &to_sleep) == -1) && (errno == EINTR)); 

儘管如此,如果您使用的是NSThread ,那麼你最好使用:

[NSThread sleepForTimeInterval:1.0f]; // sleep for 1 second 

這是睡眠的可可方式,而不會從「打嗝」是sleepusleepnanosleep經驗遭受

舊答案 - 在調試器下無法正常工作。

如果你想阻止你的usleep被中斷的線程,你需要屏蔽所有可能傳遞給線程的信號。例如

#include <signal.h> 

sigset_t sigset; 
sigset_t oldset; 
sigfillset(&sigset); 
pthread_sigmask(SIG_BLOCK, &sigset, &oldset); 
usleep(9999); 
pthread_sigmask(SIG_SETMASK, &oldset, NULL); 

:沒有錯誤在此代碼

+0

這可能會起作用(但我懷疑它是否是調試器),但它並不真正回答OP的問題。真正的問題是*爲什麼不起作用?*?它應該工作。 – bbum

+0

@Petesh代碼不起作用。 – fdh

+0

呵呵,在調試器下運行時似乎有4箇中斷。即使使用信號阻止代碼,它也不起作用。我會重構使用nanosleep技巧的答案。 – Petesh