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 Mountain Lionを使用していることに注意してください。Cocoa を使用して OSX 用のアプリを開発しています。

4

2 に答える 2

4

usleepsleep信号の配信によってこのように中断することができます。

専用のシグナル配信スレッドがないため、アプリケーション内の任意のスレッドにシグナルを配信できます。

以下に残されている元の回答は、Mountain Lion では正しく機能しませ。XCodeで実行すると、他の何かが EINTR をトリガーしています。

この問題を回避するために、 に切り替え、nanosleep中断されたときに 2 番目のパラメーターで残り時間を返すという事実を使用します。

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

sleepこれはココアの寝方であり、「しゃっくり」に悩まされることはusleepありませんnanosleep

古い回答- デバッガーでは正しく動作しません。

スレッドが中断されないようにしたい場合は、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);

: このコードではエラー チェックは行われていません

于 2012-09-03T07:28:33.810 に答える
0

いつでも任意に印刷errnoして、それが役立つことを期待することはできません。これは、特定のシステムコールが設定した後にのみ設定されるスレッドごとの変数です。

errnoつまり、コールが失敗したと判断した場合にのみ確認できます。

いずれかの呼び出しが失敗する可能性はほとんどありません。非常にありそうもない。


あなたの質問から、戻り値を取得していることは明らかではありませんでした。

  • デバッガーの外で試してみてください。デバッガーが信号を処理している可能性があります。もしそうなら、それはおそらくバグです。

  • 他に信号の多いコードやサブシステムを使用していますか? 一般に、シグナルハンドラは Unix システムでは厄介です。

  • lldbを使用していますか?gdbに切り替えてみましたか?

于 2012-09-03T00:51:10.680 に答える