0

select関数がファイルを監視するのにかかる時間を確認しようとしていますが、印刷しようとすると非常に長い数値が表示されます。コードは次のとおりです。

struct timeval to;
to.tv_usec=25;
nfds=select(maxfds+1,&readset,NULL,NULL,&to);
printf("Time left for monitering the file descriptors %d\n",to);

この奇妙な振る舞いの理由は何ですか?これは、で正常に機能するコードですto.tv_sec

ここに画像の説明を入力してください

よろしく

4

2 に答える 2

1

そのようにprintf()に構造体を渡すことはできません。メンバーの1つ、またはメンバーから作成された値を渡します。

timeval構造体の定義を実装固有の詳細までたどると、次のようなものが見つかる可能性があります。

struct timeval
  {
    __time_t tv_sec;    /* Seconds.  */
    __suseconds_t tv_usec;  /* Microseconds.  */
  };

これが言うことは、(少なくともこの特定のプラットフォームでは)メモリ内の値とそれに続くマイクロ秒の値で構成される構造がメモリ内にあるということです。これらの2つの値は、構造体のメンバーを構成します。

select()などの関数には、構造体自体へのポインターを指定する必要があります。最初のメンバーへのポインタは、多くの場合、その値と同じrawメモリアドレスを持っている可能性がありますが、形式的または移植性のある互換性はなく、構造体ポインタとして誤用された場合は警告が表示されます。

printf()のようなジェネリックプレーン値関数はtimeval構造体の知識がないため、理解できる数値型として解釈できる構造体メンバー、または構造体メンバーを組み合わせて作成された値のいずれかを指定する必要があります。たとえば、両方のフィールドを使用して64ビット時間をミリ秒単位で計算し、64ビットのprintf形式指定子で表示することは非常に一般的です。

于 2012-11-18T16:47:25.497 に答える
0

もう1つの問題は、構造体の値を初期化していないことだと思います。あなたはそれを宣言します。それはそこに残されたゴミデータとともにスタック上にそれを作成します。次に、tv_usecメンバーのみを設定します。

次のように宣言して初期化することをお勧めします。struct timeval to = {0, 25};これにより、すべての構造体フィールドが設定されることが保証されます。

于 2012-11-18T21:26:16.640 に答える