5

私のプログラムは単純な呼び出しでスタックしますusleep(1.);。それはどうしてですか?何に気をつければいいですか?

編集:

事態をさらに混乱させるために、前に rand() を呼び出した場合にのみスタックします。

rand();
usleep(1.);

両方の呼び出しは個別に問題ありません。

編集2:

動作する最小限の例を次に示します。

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

int main(int argc, char* argv[]) {
        printf("Calling rand() and then usleep(1) on pid %d \n",getpid());
        rand();
        usleep(1);
        printf("Finished.\n");
        return 0;
}

これも機能します:

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

int main(int argc, char* argv[]) {
        printf("Calling usleep(1.) on pid %d \n",getpid());
        usleep(1.);
        printf("Finished.\n");
        return 0;
}

ただし、これは次のことを行いません。

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

int main(int argc, char* argv[]) {
        printf("Calling rand() and then usleep(1.) on pid %d \n",getpid());
        rand();
        usleep(1.);
        printf("Finished.\n");
        return 0;
}

コマンドを使用して、これらを gcc バージョン 4.4.6 でコンパイルしますgcc -std=c99 main.c。オプション-std=c99が問題?しかし、私はまだここで何が起こっているのか理解していません。

4

3 に答える 3

5

値を使用して呼び出しusleep()ていますが、範囲が制限されたdouble型の符号なし整数を取るように指定されています。マニュアルページuseconds_tを参照してください。

お使いのプラットフォームでは、変換が失敗する可能性があります。ピリオドを削除してみて、 で呼び出してください1

useconds_tキャストを導入しないでください。型について言及しないのが最善です。

また、この関数は廃止されていることに注意してくださいnanosleep()。代わりに新しい POSIX コードを使用する必要があります。

更新ところで、上記のリンクされたマニュアルページは、この機能を取得するには、#define前にリストされた適切なシンボルを使用する必要があることも暗示しているようです。#include <unistd.h>プロトタイプを取得していない場合、引数は から自動的に変換されませんdouble。からの (無視された) 戻り値はrand()、一部のレジスターまたはスタック上にある可能性もあり、その場合、状況がさらに変化します。

于 2013-01-15T15:09:09.743 に答える
2

usleep http://www.manpagez.com/man/3/usleep/のマニュアルページから、の入力パラメーターは、コードに示されているとおりでusleepuseconds_tありませんfloat

于 2013-01-15T15:08:44.053 に答える
0

私はいくつかのことを試しました。

  1. それをすることについて特別なことは何もありrand(); printfません。以下もこの動作を示しています (「Starting」と言った後にハングします) が、最初printf()をコメントアウトすると、プログラムは完了します。

    include <stdio.h>
    include <unistd.h>
    
    void main(int argc, char* argv[]) {
        printf ("Starting\n"); 
        usleep(10.1);
        printf("Finished.\n");
    }
    
  2. -std=gnu89(または c99)ではなく (または gnu99) でコンパイルすると-std=c89、プログラムは常に動作します。

  3. -o0 から -o3 までのさまざまな順列は違いはありません。

  4. usleepfloat ではなく int が必要です。明示的にキャストすると、つまりusleep((int)10.1)、プログラムはハングしません。

  5. 警告 (-Wall -Wextra -Wconversion) をオンにすると、 の暗黙の宣言について不平を言いusleepます。

于 2013-01-15T16:18:15.887 に答える