2

最新バージョンのOSX10.8.2と最新のXcode4.5で、次の問題が発生しています。

次の簡単なコードを取ります。

#include <iostream>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, const char * argv[])
{
    pid_t pid = fork();

    if (0 == pid)
    {
        std::cout << "Child process!\n";

        exit(0);
    }
    else if (-1 == pid)
    {
        std::cout << "Error forking.\n";
    }
    else
    {
        std::cout << "In parent, created pid " << pid << ".\n";

        sleep(100000);      // Sleep a long time - GDB/LLDB ignores the first sleep statement
        sleep(3);           // Sleep 3 more seconds - GDB/LLDB doesn't ignore the second sleep statement

        std::cout << "Done in parent!\n";
    }

    return 0;
}

clang++ foo.cpp -o fooまたはを使用してコンパイルし、を使用しg++ foo.cpp -o fooて実行し./fooます。予想どおり、実行には長い時間がかかります。

またはのいずれlldb ./foogdb ./fooを実行runしてから、3秒で完了することに注意してください。いずれかのデバッガーが使用される場合は常に、最初のスリープステートメントは無視されているように見えます。

Xcodeはプロジェクトの実行時にデフォルトでlldbを使用するため、上記のコードを空のXcodeプロジェクトに貼り付けて、Product->Runを実行すると同様の結果が得られます。

gdb 7.2を搭載したLinuxマシンで同じ実験を試しましたが、問題は発生しませ

これは、Appleが使用している古いバージョンのgdb(gdb 6.3.50-20050815(Appleバージョンgdb-1822))のバグですか、それとも別のものですか?他のOSXユーザーに起こらなければ、おそらく私のコンピューターだけが台無しになっているのでしょうか。

4

2 に答える 2

2

多くの人はそれを使用しませんが、sleep実際には戻り値があります。

man 3 sleep

戻り値

If the sleep() function returns because the requested time has elapsed,
the value returned will be zero.  If the sleep() function returns due
to the delivery of a signal, the value returned will be the unslept amount
(the requested time minus the time actually slept) in seconds.

確かに、観察された動作を考慮して期待値が返されます。

于 2012-09-26T05:08:06.157 に答える
1

問題は、デバッガーがプロセスを一時停止したいときはいつでも、そのプロセスがシステムコールの途中(カーネルランドでコードを実行している)である場合、そのシステムコールはEINTRスタイルで中止されるという事実に起因すると思います。 Mac OSX。Linuxシステムがこれをどのように処理するかはわかりませんが、Mac OS Xで発生します。プログラムを実行し、別のウィンドウでlldbを使用してプログラムに接続し、プロセスを続行すると、 sleep(100000); 実行が再開されるとすぐに呼び出しが終了します。子プロセスが終了するときにSIGCHLDシグナルがブロードキャストされている必要があり、そのために親プロセスがデバッガーによって中断されているようですが、長いsleep()呼び出しが早期に終了する原因については完全にはわかりません。この特定のケースでは。

于 2012-09-27T21:48:56.100 に答える