我需要捕获一些指标,例如发送 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 评论似乎是处理上述问题的最安全方法。