我有一个正在单独的队列/线程上运行的函数。在此函数中,我尝试调用usleep

无论传入的值如何,usleep似乎都不起作用。 sleep()也是如此。

为了诊断错误,我打印了errnoerrno打印为:“系统调用中断”

这到底是什么意思,我该如何诊断呢?

手册页将错误描述为:

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


注意我在OSX Mountain Lion上使用Xcode 4和Objective-C。我正在使用Cocoa开发OSX应用程序。

最佳答案

usleepsleep可以通过传递信号来中断。

没有专用的信号传递线程,因此可以将信号传递到应用程序中的任意线程。

注意:下面留下的原始答案在Mountain Lion上无法正常使用-在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经历的“打ic”

旧答案-在调试器下无法正常工作。

如果要防止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);


注意:此代码中未进行错误检查

关于objective-c - 为什么不 sleep 呢?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12239866/

10-12 05:12