⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 monapi.cc

📁 此源代码只用于学习,不得用于其他商业活动 .
💻 CC
📖 第 1 页 / 共 2 页
字号:
		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 + -