📄 monapi.cc
字号:
LastTime = CurrentTime;
}
//end
ShareMemory.WriteShareMemory(CurrentIndex,&lv_ShareMemory);
return;
}
/*
* Function Name :MonitorInit
* Description :监控初始化
* Input Param :同主函数
* Returns :true(成功) or false(失败)
* complete :
*/
bool C_Monitor::MonitorInit(int argc, char *argv[])
{
if(!ShareMemory.ShareMemoryInit())
{
return false;
}
S_ShareMemoryInformation *pShareMemory = 0;
pShareMemory = ShareMemory.GetpShareMemory();
S_ShareMemoryInformation lv_ShareMemory;
memset(&lv_ShareMemory, 0, sizeof(lv_ShareMemory));
CurrentIndex = atoi(argv[2]);
//冯亮添加于2003-01-17,用于判断参数的正确性
if((CurrentIndex <= 0) || (CurrentIndex >= MON_MAXPROC) || (atoi(argv[1]) <= 0) || (atoi(argv[1]) >= MAX_CHANNEL_NUMS))
{
return false;
}
int i = 0;
for(i = 0; i < MON_MAXPROC; i++)
{
if((pShareMemory + i)->CurrentIndex == CurrentIndex)
{
//共享内存索引已经被占用
return false;
}
}
MonitorClear();
/*写入进程的短名*/
char chProcName[LINE_LENGTH];
memset(chProcName, 0, sizeof(chProcName));
strcpy(chProcName, argv[0]);
GetShortProcName(chProcName);
sprintf(lv_ShareMemory.commandline, chProcName);
/*写入进程ID号*/
sprintf(lv_ShareMemory.procid, "%d", getpid());
time_t Now;
struct tm *Time = 0;
time(&Now);
Time = localtime(&Now);
/*写入进程启动日期*/
memset(lv_ShareMemory.startdate,0,sizeof(lv_ShareMemory.startdate));
sprintf(lv_ShareMemory.startdate,"%04d-%02d-%02d",Time->tm_year+1900,Time->tm_mon+1,Time->tm_mday);
/*写入进程启动时间*/
memset(lv_ShareMemory.starttime,0,sizeof(lv_ShareMemory.starttime));
sprintf(lv_ShareMemory.starttime,"%02d:%02d:%02d",Time->tm_hour,Time->tm_min,Time->tm_sec);
/*写入进程的通道号*/
lv_ShareMemory.ChannelCode = atoi(argv[1]);
/*写入进程在共享内存中的索引号*/
lv_ShareMemory.CurrentIndex = CurrentIndex;
/*总话单条数*/
lv_ShareMemory.total = 0;
/*错单条数*/
lv_ShareMemory.error= 0;
ShareMemory.WriteShareMemory(CurrentIndex, &lv_ShareMemory);
return true;
}
/*
* Function Name :MonitorClear
* Description :清除共享内存的内容
* Input Param :
* Returns :true(成功)
* complete :
*/
bool C_Monitor::MonitorClear(void)
{
S_ShareMemoryInformation lv_ShareMemory;
memset(&lv_ShareMemory, 0, sizeof(lv_ShareMemory));
ShareMemory.WriteShareMemory(CurrentIndex, &lv_ShareMemory);
return true;
}
/*
* Function Name :Trim
* Description :去掉字符串左右的空格
* Input Param :需要去掉空格的字符串
* Returns :无
* complete :
*/
void C_Monitor::Trim(char * String)
{
char *Position = String;
/*找到第一个不是空格的位置*/
while(isspace(*Position))
{
Position++;
}
/*如果为一空串则退出*/
if (*Position == '\0')
{
*String = '\0';
return;
}
/*除去前面的空格*/
while(*Position)
{
*String = *Position;
String++;
Position++;
}
/*除去后面的空格*/
do
{
*String = '\0';
String--;
}while(isspace(*String));
}
/*
* Function Name :ProcIsExist
* Description :检查本进程是否已经存在
* Input Param :与main函数同
* Returns :true(存在) or false(不存在)
* complete :
*/
bool C_Monitor::ProcIsExist(int argc, char *argv[])
{
int i;
int iNums = 0;
FILE *fp = 0;
char *lv_chPoint = 0;
char *pchLoginName = 0;
char chScanBuff[LINE_LENGTH];
char chCommandLine[LINE_LENGTH];
char chTemp[LINE_LENGTH];
memset(chScanBuff, 0, sizeof(chScanBuff));
memset(chCommandLine, 0, sizeof(chCommandLine));
memset(chTemp, 0, sizeof(chTemp));
if((pchLoginName = getenv("LOGNAME")) == 0)
{
printf("Not get the environment \"LOGNAME\" in C_Monitor::ProcIsExist!\n");
return true;
}
lv_chPoint = argv[0];
for(i = 0; *lv_chPoint; lv_chPoint++, i++)
{
if (*lv_chPoint == '/')
{
i = -1;
continue;
}
chCommandLine[i] = *lv_chPoint;
}
chCommandLine[i] = '\0';
for(i = 1; i < ARGNUMS; i++)
{
strcat(chCommandLine, " ");
strcat(chCommandLine, argv[i]);
}
Trim(chCommandLine);
sprintf(
chScanBuff,
"ps -fu %s | cut -c 40-",
pchLoginName
);
if((fp = popen(chScanBuff , "r")) == 0)
{
return true;
}
while(fgets(chScanBuff, sizeof(chScanBuff), fp) != 0)
{
memset(chTemp, 0, sizeof(chTemp));
strcpy(chTemp, chScanBuff);
lv_chPoint = strchr(chScanBuff, ':');
if(lv_chPoint == 0)
{
memset(chScanBuff, 0, sizeof(chScanBuff));
continue;
}
lv_chPoint += 3;
memset(chTemp, 0, sizeof(chTemp));
strcpy(chTemp, lv_chPoint);
Trim(chTemp);
//获取带参数的绝对命令行
lv_chPoint = chTemp;
memset(chScanBuff, 0, sizeof(chScanBuff));
for(i = 0; (*lv_chPoint) && (*lv_chPoint != ' '); lv_chPoint++,i++)
{
if (*lv_chPoint == '/')
{
i = -1;
continue;
}
chScanBuff[i] = *lv_chPoint;
}
chScanBuff[i] = 0;
//获取绝对命令行的参数列表
lv_chPoint = strchr(chTemp, ' ');
if(lv_chPoint != 0)
{
Trim(lv_chPoint);
strcat(chScanBuff, " ");
string sTemp = lv_chPoint;
string::size_type CurrentPos = -1;
string sSub;
CurrentPos = sTemp.find_first_of(' ');
sSub = sTemp.substr(0, CurrentPos);
strcat(chScanBuff, sSub.c_str());
}
Trim(chScanBuff);
Trim(chCommandLine);
if(strcmp(chScanBuff, chCommandLine) == 0)
{
iNums++;
}
memset(chScanBuff, 0, sizeof(chScanBuff));
}//end while(fgets(chScanBuff, sizeof(chScanBuff), fp) != 0)
pclose(fp);
if(iNums > 1)
{
return true;
}
else
{
return false;
}
}
void C_Monitor::GetShortProcName(char *pchProcName)
{
//此变量用来截取不带路径的执行文件名
char *pchTemp = 0;
pchTemp = strrchr(pchProcName, '/');
char chShortName[LINE_LENGTH];
memset(chShortName, 0, sizeof(chShortName));
if(0 == pchTemp)
{
Trim(pchProcName);
}
else
{
pchTemp++;
strcpy(chShortName, pchTemp);
strcpy(pchProcName, chShortName);
Trim(pchProcName);
}
return;
}
//----------------------------------------The End----------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -