gccで遅延が利用できないのはなぜですか? 私の理解によると、遅延機能はプログラムを停止し、スリープ機能はプログラムをスリープ状態にしてコンテキスト切り替えを実行します。プログラムを停止したい場合、gcc で利用可能なオプションは何ですか?
2 に答える
delay
私の知る限り、C99またはC2011標準にはないからです。
C 標準は、API に関して非常に貧弱です (ほとんどの場合、 、 のFILE*
ようないくつかのメモリ操作、いくつmalloc
かの文字列操作、およびsetjmp
... については知っています。ディレクトリや遅延については知りません)。
コンテキストの切り替えは、純粋な標準 C では意味がありません (Unix 風のマルチタスク オペレーティング システムでのみ意味があります)。
遅延関数は、(非標準 C) プログラミング環境によって提供される必要があります。Linux では、実際にスリープや他の多くの機能を持つ Posix のスーパーセットです。sched_yield(2) syscall を使用して、コンテキスト スイッチを「強制」することができます。
Advanced Linux Programmingのような本を読むべきです。システムを停止するには、sync(2)およびreboot(2)システムコールを使用する必要があるかもしれませんが、これはおそらく悪い考えです。またはコマンドなどsystem(3)
で実行したいでしょう。shutdown
halt
特定のプログラムを停止したい (そしてシステムの残りの部分に通常どおり他のプロセスを実行させたい) 場合は、C 標準にあるexit(3)を呼び出すだけです。
PS。カーネル デバイス ドライバーを作成する場合は、そのことを質問に明示的に記載する必要があります。また、Linux についてさらに多くのことを学ぶ必要があります。一部のドライバーでは、重大な問題が発生したときにパニック関数を呼び出すことがあります。
そうするとsleep()
、OSはすぐにコンテキストを切り替えます。この振る舞いはあなたを満足させませんか?つまり、CPU を保持し、一定期間何もしないでしょうか? 次に、busy_waiting; を実行します。for(; ; ;) break_if_time_elapses
. それでも、OS によるタイム スライス ベースのコンテキスト切り替えを回避することはできません。したがって、OS のタイム スライスよりも短い、非常に短い時間で意味があります。