📄 propool.c
字号:
return 0;
}
/******************************************************************************
函数名称: SetPoolOn
函数功能: 设置进程池为可用状态
输入参数: 无
输出参数: 无
返 回 值: 0 -- 正常
******************************************************************************/
int SetPoolOn()
{
SetPoolStatus(PSTATUS_ON);
return 0;
}
/******************************************************************************
函数名称: SetPoolOff
函数功能: 设置进程池为不可用状态
输入参数: 无
输出参数: 无
返 回 值: 0 -- 正常
******************************************************************************/
int SetPoolOff()
{
SetPoolStatus(PSTATUS_OFF);
return 0;
}
/******************************************************************************
函数名称: GetChildProcInfo
函数功能: 根据进程号获取子进程相关信息
输入参数: 无
输出参数: 无
返 回 值: 0 -- 成功
******************************************************************************/
int GetChildProcInfo(pid_t pid, Pool *SPool)
{
int i;
Pool *pSPool;
pSPool = (Pool *)ShmLink(SHMKEY_POOL);
for(i = 0; i < GetValidProcNum(); i++)
{
if(pid == pSPool[i].iPid)
{
break;
}
}
memcpy(SPool, pSPool + i, sizeof(Pool));
return 0;
}
/******************************************************************************
函数名称: GetChildProcInfo
函数功能: 根据索引号获取子进程相关信息
输入参数: 无
输出参数: 无
返 回 值: 0 -- 成功
******************************************************************************/
int GetChildProcInfoIndex(int index, Pool *SPool)
{
Pool *pSPool;
pSPool = (Pool *)ShmLink(SHMKEY_POOL);
memcpy(SPool, pSPool + index, sizeof(Pool));
return 0;
}
/******************************************************************************
函数名称: CreateChildProc
函数功能: 进程池初始化
输入参数: iInitNum -- 初始化进程数
输出参数: 无
返 回 值: 0 -- 成功
<0 -- 失败
******************************************************************************/
static int CreateChildProc(int i, TSocket *sock)
{
Pool *pSPool;
pSPool = (Pool *)ShmLink(SHMKEY_POOL);
printf("CreateChildProc......................begin\n");
pSPool[i].iPid = getpid();
pSPool[i].lRate = 0;
pSPool[i].EStatus = CSTATUS_IDLE;
pSPool[i].lLastTime = 0;
pSPool[i].lPort = sock->LocalPort;
/*有些进程数 +1*/
IncValidProcNum();
return 0;
}
/******************************************************************************
函数名称: CreatePool
函数功能: 进程池初始化
输入参数: func -- 输入函数指针
data -- func函数输入参数
输出参数: 无
返 回 值: 0 -- 成功
<0 -- 失败
******************************************************************************/
int CreatePool(int (*func)(int), int iForkFlag, TSocket *sock, LinkNode *link)
{
int i;
pid_t pid;
Module *pSMod;
LinkNode *pNode;
for(i = 0; i < GetInitProcNum(); i ++)
{
SetEnv_tcp(sock, atol(pSMod->port));
switch((pid = fork()))
{
case -1:
fprintf(stderr, "FORK ERROR : [%s] \n", strerror(errno));
ClearIPC();
return -1;
case 0:
CreateChildProc(i, sock);
for(;;)
{
Accept();
}
func();
default:
continue;
}
}
return 0;
}
/******************************************************************************
函数名称: UseChildProc
函数功能: 使用子进程
输入参数: 无
输出参数: 无
返 回 值: 0 -- 成功
<0 -- 失败
******************************************************************************/
int UseChildProc()
{
int i;
pid_t pid;
Pool *pSPool;
pSPool = (Pool *)ShmLink(SHMKEY_POOL);
pid = getpid();
for(i = 0; i < GetValidProcNum(); i ++)
{
if(pSPool[i].iPid == pid)
{
break;
}
}
/*置进程状态为忙碌*/
pSPool[i].EStatus = CSTATUS_ACT;
pSPool[i].lLastTime = atol(GetSysTime());
/*此进程被使用次数 +1*/
pSPool[i].lRate ++;
IncActProcNum();
return 0;
}
/******************************************************************************
函数名称: RlsChildProc
函数功能: 释放子进程
输入参数: 无
输出参数: 无
返 回 值: 0 -- 成功
<0 -- 失败
******************************************************************************/
int RlsChildProc()
{
int i;
pid_t pid;
Pool *pSPool;
pSPool = (Pool *)ShmLink(SHMKEY_POOL);
pid = getpid();
for(i = 0; i < GetValidProcNum(); i ++)
{
if(pSPool[i].iPid == pid)
{
break;
}
}
/*激活进程数减 1*/
DecActProcNum();
/*置进程状态为空闲*/
pSPool[i].EStatus = CSTATUS_IDLE;
return 0;
}
/******************************************************************************
函数名称: MonitorPool
函数功能: 监控进程池
输入参数: 无
输出参数: 无
返 回 值: 0 -- 成功
<0 -- 失败
******************************************************************************/
int MonitorPool()
{
int i;
Pool *pSPool;
pSPool = (Pool *)ShmLink(SHMKEY_POOL);
while(1)
{
for(i = 0; i < GetValidProcNum(); i ++)
{
/*
* 如果为异常进程,则重置此子进程
*/
if( pSPool[i].iPid > 0 && kill(pSPool[i].iPid, 0) != 0)
{
pSPool[i].iPid = 0;
pSPool[i].EStatus = CSTATUS_IDLE;
pSPool[i].lRate = 0;
pSPool[i].lLastTime = 0;
}
}
}
}
/******************************************************************************
函数名称: ClearPool
函数功能: 释放进程池
输入参数: iFlag -- 是否强制关闭进程池(即 当子进程正在处理交易时,是否强制关闭它)
1: 当子进程空闲时 才能被杀掉
输出参数: 无
返 回 值: 0 -- 成功
<0 -- 失败
******************************************************************************/
int ClearPool(int iFlag)
{
int i;
time_t t0;
for(i = 0; i < GetValidProcNum(); i ++)
{
if(iFlag == 1)
{
t0 = time(NULL);
while(g_SPool[i].EStatus == CSTATUS_ACT)
{
/*超时时间*/
if(time(NULL) - t0 > OFF_WAITTIME)
{
break;
}
}
}
if(g_SPool[i].iPid > 0)
{
kill(g_SPool[i].iPid, SIGTERM);
}
}
ClearIPC();
free(g_SPool);
free(g_SPoolCtrl);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -