私は眠っている男でそれを見ました:
EINVAL
usec is not smaller than 1000000. (On systems where that is considered an error.)
したがって、 Ubuntuで1000000より大きい値のusleepを使用しても大丈夫かどうか、そうでない場合(または他のプラットフォームをサポートしたい場合)、2.2秒間のスリープが必要な場合の代替手段は何ですか(たとえば)。
ありがとうございました。
Linuxカーネルソースを100%確実に確認する必要がありますが、Ubuntuはx86とx86-64でのみ配布されていることを考えると、基盤となるPOSIXで許可されているかどうかに関係なく、この種の動作はすぐに受け入れられないことに気付くでしょう。スペック、それが壊れる可能性は本質的にゼロです。
Linuxは多種多様なシステムに移植されており、ポートは他の醜い既存のカーネルコードを採用できるため、マンページの作成者は、奇妙なマイクロコントローラーに対応するように設計された非常に緩い要件を反映するPOSIX(またはその他)仕様を採用したときにお尻をカバーしていたと思いますslapdashカーネルを使用します。
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
、コンパイル時に適切なものを検出できます。ローカルシステムに引数の制限がない場合は、プレーンラッパーに切り替えることもできます。何時間も楽しむことができます。