1

我需要捕获一些指标,例如发送 tcp 消息的时间和 linux 上 c 中每秒发送的消息数。我想知道这是否可以通过计时器来完成,这样每当计时器到期时,我只需打印指标。主要问题是在增加指标时可能会发生计时器,在这种情况下,我的信号处理程序将打印损坏的数据。有没有办法解决这个问题?

所以我脑海中的伪代码是声明一个全局结构,其中包含每次发送和计数的发送时间。

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;
}

然后提供一些可以在 struct db 上工作的函数,例如

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

使用我们的程序在用户(您的代码)和内核模式(发送等)中使用了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 回答
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 回答