5


1

Linux上のCで非同期のタイミング関数呼び出し?

LinuxのCで特定の遅延(JavaScriptの setTimeout`など)の後に関数を非同期的に呼び出す、または定期的なタイマー呼び出しを設定する( setInterval`と同様)最も簡単で効果的な方法は何ですか?

この質問はLinuxにも当てはまりますが、クロスプラットフォームの方法があることを願っています。

2 Answer


9


Linux固有の最も単純なソリューションは、 `alarm`関数を使用することです:

void alarm_handler (int signum)
{
    printf ("Five seconds passed!\n");
}

signal (SIGALRM, alarm_handler);
alarm (5);

「getitimer」および「setitimer」関数を使用して、より高精度のタイマーを作成できます。 (http://opengroup.org/onlinepubs/007908799/xsh/getitimer.html [more …​])。


6


対処方法は2つあります。

最初に、別の答えで述べたように、「alarm()」または「setitimer()」を使用してトリガーされるシグナルです。 両方の機能は、POSIXに準拠するOSで使用できます。 2008年に廃止された `ualarm()`と呼ばれる3番目の関数があります。 欠点は、シグナルハンドラーで重要なこと(たとえば、I / Oまたは他のシステムコール)を行うことは安全ではないことです。したがって、本当にしたいことは、フラグを設定して、他のものにそれを拾わせることです。

2つ目は、一定の間隔でスリープしてから関数を呼び出すスレッドを使用することです。 POSIXは1990年代初期にスレッドを拡張機能として標準化し、スレッドをサポートする最新のOSのほとんどはPOSIXスレッドをサポートしています。 ここでの落とし穴は、2つの実行コンテキストが同じデータ空間を共有することの意味を理解し、それに応じてプログラムを設計するか、デバッグするのが困難な問題に遭遇することです。

アラームとスリープは、少なくとも指定された時間が経過した後にのみ実行することを約束するため、リアルタイムオペレーティングシステムで得られるような精度を保証するものではないことに注意してください。