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 のコメントは、上記の問題を処理する最も安全な方法のようです。