0

私は眠っている男でそれを見ました:

EINVAL
usec is not smaller than 1000000. (On systems where that is considered an error.) 

したがって、 Ubuntuで1000000より大きい値のusleepを使用しても大丈夫かどうか、そうでない場合(または他のプラットフォームをサポートしたい場合)、2.2秒間のスリープが必要な場合の代替手段は何ですか(たとえば)。

ありがとうございました。

4

2 に答える 2

1

Linuxカーネルソースを100%確実に確認する必要がありますが、Ubuntuはx86とx86-64でのみ配布されていることを考えると、基盤となるPOSIXで許可されているかどうかに関係なく、この種の動作はすぐに受け入れられないことに気付くでしょう。スペック、それが壊れる可能性は本質的にゼロです。

Linuxは多種多様なシステムに移植されており、ポートは他の醜い既存のカーネルコードを採用できるため、マンページの作成者は、奇妙なマイクロコントローラーに対応するように設計された非常に緩い要件を反映するPOSIX(またはその他)仕様を採用したときにお尻をカバーしていたと思いますslapdashカーネルを使用します。

于 2012-08-29T09:59:58.707 に答える
1

1つの代替方法は、ドキュメントを信頼し、安全のためにループを使用して実装することです。

#define USLEEP_MAX (1000000 - 1)

void long_sleep(unsigned long micros)
{
  while(micros > 0)
  {
    const unsigned long chunk = micros > USLEEP_MAX ? USLEEP_MAX : micros;
    usleep(chunk);
    micros -= chunk;
  }
}

の戻り値も調べる必要がありますusleep()。簡潔にするために省略しました。

本番環境では、 Autoconfや友人と一緒に楽しんでUSLEEP_MAX、コンパイル時に適切なものを検出できます。ローカルシステムに引数の制限がない場合は、プレーンラッパーに切り替えることもできます。何時間も楽しむことができます。

于 2012-08-29T09:50:27.160 に答える