3

定期的に何らかのタスクを実行する (たとえば、コンソールに何かを出力する) C プログラムを作成したいと考えています。

以下のように nanosleep を使用して実装しました。500 ミリ秒ごとに関数「func」が呼び出されます。

#include <stdio.h>
#include <time.h>

void func(void);

int main()
{
  struct timespec mytimespec;
  mytimespec.tv_sec = 0;
  mytimespec.tv_nsec = 500000000; /* 500 ms */

  while(1)
  {
    func(); 
    nanosleep(&mytimespec,NULL);
  }
  return 0;
}

void func(void)
{
  printf("This would be printed periodically\n");
}

上記は正常に動作しています。しかし、私はいくつかの疑問があります:-

  • nanosleep複数のスレッドがあり、1 つのスレッドが定期的なタスクの実行に依存している場合、正確に機能しますか?

  • Linux で定期的なスレッドを生成する方法はありますか? または、いくつかのタイマー コールバックを使用するには?

4

4 に答える 4

2

time(7) (およびおそらくsignal(7) ...)を読む必要があります。おそらく何らかのイベント ループが必要になるでしょう(少なくとも、プログラムが何らかの入力を行っている場合)。そのループは、 poll(2)のような多重化システムコールに基づいています(これその回答も参照してください)。多くのライブラリは、特にlibeventlibev、Gtk/Glib、Qt などのイベント ループを提供します。

Linux では、 timerfd_create(2) (他のより伝統的なソリューションに加えて) に興味があるかもしれません。

高度な Linux プログラミングを読む

于 2013-10-18T10:42:05.307 に答える
1

複数のスレッドがあり、1 つのスレッドが定期的なタスクを実行するために nanosleep に依存している場合、正確に機能しますか?

関数nanosleep()は、引数で指定した時間より早く戻りません (シグナル ハンドラーによって中断されるか、エラーが発生しない限り)。ただし、後で戻る場合があります (通常は少し後で)。

次の記事をご覧ください: http://www.drdobbs.com/soft-real-time-programming-with-linux/184402031 - タイマーをうまく説明しているようです。

Linux で定期的なスレッドを生成する方法はありますか? または、いくつかのタイマー コールバックを使用するには?

タイマーを見てみましょう: http://man7.org/linux/man-pages/man2/timer_create.2.html

于 2013-10-18T10:11:55.627 に答える