13

プログラムからスリープ機能を含めると、unistd.h無期限にハングします。

#include <stdio.h>
#include <unistd.h>

int main()
{
        int i;
        printf("0 ");
        for(i = 1; i <20; ++i)
        {
            sleep(2);
            printf("%d ", i);
        }
        printf("\n");

        return 0;
}

sleep(2)コメントアウトすると、残りは正常に実行されます。何かアイデアはありますか?

4

4 に答える 4

17

コードに問題はありませんが、多くの場合、 の出力はバッファリングされることに注意してください。つまり、明示的に を呼び出すか、改行を出力するか、バッファがいっぱいになったprintf場合にのみ出力がコンソールに表示されます。fflush(stdout)最後まで改行を出力しないため、 for ループには 40 秒間何も表示されません (出力された内容printfがまだバッファーにあるため)。次に、実行がヒットprintf("\n")すると、バッファがフラッシュされるため、すべてが一度に出力されます。

要するに、出力バッファーに何も残らないようにするために呼び出すfflush(stdout)前に呼び出すかsleep、40 秒間待機して、最終的に 1 つのバッチで出力を取得するかのいずれかです。

于 2012-11-26T15:57:32.530 に答える
6

hangs indefinitelyスタックまたは非決定論的であることを意味し、それは起こりません。あなたのコードは正常に動作し、38 秒 (19 *2) 後に 0 から 19 までの文字列をダンプします。

int main()
{
        int i;
        printf("0 ");
        fflush(stdout);  // Force the output to be printed
        for(i = 1; i <20; ++i)
        {
            sleep(2);
            printf("%d ", i);
            fflush(stdout); // Force the output to be printed
        }
        printf("\n");

        return 0;
}

stdoutストリームはバッファリングされ、改行にヒットしたときにのみ表示されるか'\n'、呼び出しとして「リアルタイム」で表示したい場合は、何らかのprintf()方法でバッファを強制的にフラッシュする必要があります。を呼び出すと、fflush(stdout)これが行われます。

于 2012-11-26T16:07:36.490 に答える
0

Windows コンピューターを使用していますか? その場合は、プログラムに含め<windows.h>、プログラムを一時停止するには、次のように記述します。

Sleep(time_in_milliseconds)

あなたの場合、time_in_milliseconds は 2000 にする必要があります。

一方、UNIX ベースのコンピューターを使用している場合、コードは問題ないように見えます ( は必要ありません<windows.h>)。

于 2012-11-26T16:03:37.773 に答える