1. 程式人生 > >Linux C語言實時監測某變數是否變化,一段時間未變化,再次傳送

Linux C語言實時監測某變數是否變化,一段時間未變化,再次傳送

描述下大致功能:需要監測某個變數或整個函式返回值是否發生變化,若發生了變化,將變化的值傳出去,若5分鐘內該變數值還沒有變化,變數也會繼續傳出去。
用處:監測某個預警值,發生警告了就處理,但是又不想一直髮送,發生了新的告警資訊才傳送,如果同一個告警資訊,一段時間沒有處理,需要再次發生該告警資訊,及時處理告警。

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int monitor_var();
void main()
{
    int monitor;
    int i=0;
    static
int monitor_var_keep; int start,finish; float total_time=0; while(1) { while(1) { start =time(NULL);//記錄本次監測變數開始的時間 monitor = monitor_var(); /*monitor_var_keep=0是因為第一次執行或者檢測monitor是否發生變化*/ if((monitor_var_keep==0)|(monitor!=monitor_var_keep)) { monitor_var_keep = monitor; break
; } finish = time(NULL);//記錄本次監測變數結束時間 total_time +=(float)(finish-start);//記錄監測變數總時間 printf("total_time is %f\n",total_time); if(total_time>=3.0)//當監測3s沒有發生變化,總時間清零,並退出迴圈。 { total_time=0; break; } }//end while /*只有退出上一層while迴圈才會執行後續的3個列印語句。*/
printf("monitor is %d\n",monitor); printf("monitor_var_keep is %d\n",monitor_var_keep); /*此處根據需要寫處理監測變數的函式,例如進行UDP通訊,將資料傳送到服務端*/ printf("recycle %d time\n",++i); }//end while。 }//end main。 int monitor_var() { int i=1; srand(time(NULL)); i = rand()%3+1; sleep(1); printf("i = %d\n",i); return i; }

這裡寫圖片描述

這裡寫圖片描述
從執行的結果可以看出第一次執行 i =2,會退出第一層while迴圈(執行了3個列印語句),第二次第三次也因為i的值確實發生了變化,退出了while迴圈。
第四次i=3,與上一次結果一樣,並沒有變化,而且時間也少於3s,沒有退出,繼續監測。
從圖上看“recycle 8 time”後三次執行結果,i =3沒有變化,但是第三次i = 3的時候,超過了規定時間3s沒有變化,再發生一次監測變數,以便處理。
綜上結果分析,算是符合了要求。
/本人當時做UDP資料傳輸時,需要實時監測trap PDU是否發生變化。如果一段時間沒有處理該trap,就繼續傳送!/
/有問題歡迎指正。。。/