Linux C語言實時監測某變數是否變化,一段時間未變化,再次傳送
阿新 • • 發佈:2019-01-29
描述下大致功能:需要監測某個變數或整個函式返回值是否發生變化,若發生了變化,將變化的值傳出去,若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,就繼續傳送!/
/有問題歡迎指正。。。/