1

Linux の c で、tcp メッセージを送信する時間や 1 秒あたりに送信されるメッセージ数など、いくつかの指標を取得する必要があります。タイマーが切れるたびにメトリックを出力するように、タイマーを介してこれを行うことができるかどうか疑問に思っています。主な問題は、メトリックがインクリメントされている間にタイマーが発生する可能性があり、その場合、シグナル ハンドラーが破損したデータを出力することです。この問題を克服する方法はありますか?

したがって、私の頭に浮かんだ疑似コードは、各送信とカウントの送信時間を含むグローバル構造体を宣言することでした。

struct db
{
 struct sendTimes sendTimesPerSecond[10000]; // some large number which i cannot send in a second
 int count;
}

どこ

struct sendTimes
{
  timeval start_time;
  timeval end_time;
}

次に、次のような構造体データベースで機能するいくつかの関数を提供します

void record_send_time(pointer_to_db, sendTimes); // simply store the times
void incrementMessagesSent(pointer_to_db); //basically count++

次に、次のようなことができます:-

signal(SIGALRM, alarm_handler);
alarm(1)
struct db database;

for(;;) {
struct sendTimes sTime;
sTime.start_time = now(); // current time
send()
sTime.end_time = now();
record_send_time(&database, sTime);
incrementMessagesSent(&database); 
}


void alarm_handler(int signo)
{
  printf database;
  alarm(1);
 }

更新: パイプに関する Wildplasser のコメントは、上記の問題を処理する最も安全な方法のようです。

4

2 に答える 2

0

シグナル ハンドラから出力する代わりに、alarm_handler を使用してフラグを設定できます。

int print_database_flag = 0; // global flag

  // ...
  record_send_time(&database, sTime);
  if (print_database_flag) {
     printf database;
     print_database_flag = 0;
  }

void alarm_handler(int signo)
{
  print_database_flag = 1;
  alarm(1);
}
于 2012-11-26T23:54:35.543 に答える
0

ユーザー(コード)とカーネルモード(送信など)でプログラムが使用する2つのキャプチャ時間を使用しますgetrusage(2)struct timeval

#include <sys/time.h>
#include <sys/resource.h>

.

struct rusage start, end;
getrusage(RUSAGE_SELF, &start);
// do what you have to do
getrusage(RUSAGE_SELF, &end);

struct timeval utime, stime;
timersub(&end.ru_utime, &start.ru_utime, &utime);
timersub(&end.ru_stime, &start.ru_stime, &stime);
printf("Work took %lu microseconds of user time and %lu microseconds of system time\n",
     (utime.tv_sec * 1000 * 1000) + utime.tv_usec,
     (stime.tv_sec * 1000 * 1000) + stime.tv_usec
     );
于 2012-11-27T01:05:12.903 に答える