📄 propool.c
字号:
#include "propool.h"
/*************************************************
函数名称∶AcceptWait()
函数功能∶对SemLock的封装
输入参数∶无
输出参数∶无
返 回 值∶0 -- 成功
**************************************************/
int AcceptWait()
{
SemLock(SEMKEY_LOCK); /*信号灯解锁*/
return 0;
}
/*************************************************
函数名称∶AcceptRelease()
函数功能∶对SemLock的封装
输入参数∶无
输出参数∶无
返 回 值∶0 -- 成功
**************************************************/
int AcceptRelease()
{
SemUnlock(SEMKEY_LOCK); /*信号灯解锁*/
return 0;
}
/******************************************************************************
函数名称: InitPool
函数功能: 进程池初始化
输入参数: iInitNum -- 初始化进程数
输出参数: 无
返 回 值: 0 -- 成功
<0 -- 失败
******************************************************************************/
int InitPool(int iInitNum)
{
char sFileName[FILENAME_LEN];
int iRet;
int ShmID;
memset(sFileName, 0, sizeof(sFileName));
sprintf(sFileName, "%s/%s/%s", getenv("HOME"), "tmp", KEY_FILE1);
if(fclose(fopen(sFileName, "w")) == -1)
{
return -1;
}
SHMKEY_POOL = ftok(sFileName, 'a');
if(SHMKEY_POOL == -1)
{
printf("Create SHMKEY ERROR:[%s] \n", strerror(errno));
return -2;
}
SHMKEY_POOLCTRL = ftok(sFileName, 'b');
if(SHMKEY_POOLCTRL == -1)
{
printf("Create SHMKEY ERROR:[%s] \n", strerror(errno));
return -3;
}
ShmRemove(SHMKEY_POOL);
ShmRemove(SHMKEY_POOLCTRL);
/*创建共享内存*/
ShmID = ShmCreate(SHMKEY_POOLCTRL, sizeof(PoolCtrl));
if(ShmID < 0 )
{
printf("Create SHM error: [%s]\n", strerror(errno));
return -4;
}
g_SPoolCtrl = (PoolCtrl *)ShmLink(SHMKEY_POOLCTRL);
memset(g_SPoolCtrl, 0, sizeof(g_SPoolCtrl));
/*初始化PoolCtrl结构*/
g_SPoolCtrl->EPoolStatus = PSTATUS_ON;
g_SPoolCtrl->iActProcNum = 0;
g_SPoolCtrl->iInitProcNum = iInitNum;
g_SPoolCtrl->iValidProcNum = 0;
g_SPoolCtrl->iMaxProcNum = 0;
/*创建共享内存*/
ShmID = ShmCreate(SHMKEY_POOL, sizeof(Pool) * g_SPoolCtrl->iInitProcNum);
if(ShmID < 0 )
{
printf("Create SHM error: [%s]\n", strerror(errno));
/*释放已创建共享内存的资源*/
ShmUnlink((char *)g_SPoolCtrl);
ShmRemove(SHMKEY_POOLCTRL);
return -5;
}
g_SPool = (Pool *)ShmLink(SHMKEY_POOL);
memset(g_SPool, 0, sizeof(Pool) * g_SPoolCtrl->iInitProcNum);
/*生成信号灯 的键值*/
memset(sFileName, 0, sizeof(sFileName));
sprintf(sFileName, "%s/%s/%s", getenv("HOME"), "tmp", KEY_FILE2);
if(fclose(fopen(sFileName, "w")) == -1)
{
/*释放已创建共享内存的资源*/
ShmUnlink((char *)g_SPoolCtrl);
ShmUnlink((char *)g_SPool);
ShmRemove(SHMKEY_POOL);
ShmRemove(SHMKEY_POOLCTRL);
return -6;
}
SEMKEY_LOCK = ftok(sFileName, 'a');
SemRemove(SEMKEY_LOCK);
SemInit(SEMKEY_LOCK, 1);
return 0;
}
/******************************************************************************
函数名称: IncActProcNum
函数功能: 进程池中激活子进程 增加1
输入参数: 无
输出参数: 无
返 回 值: 0 -- 成功
<0 -- 失败
******************************************************************************/
int IncActProcNum()
{
PoolCtrl *pSPoolCtl;
pSPoolCtl = (PoolCtrl *)ShmLink(SHMKEY_POOLCTRL);
SemLock(SEMKEY_LOCK); /*加锁*/
pSPoolCtl->iActProcNum ++;
SemUnlock(SEMKEY_LOCK); /*解锁*/
return 0;
}
/******************************************************************************
函数名称: DecActProcNum
函数功能: 进程池中激活子进程 减少1
输入参数: 无
输出参数: 无
返 回 值: 0 -- 成功
<0 -- 失败
******************************************************************************/
int DecActProcNum()
{
PoolCtrl *pSPoolCtl;
pSPoolCtl = (PoolCtrl *)ShmLink(SHMKEY_POOLCTRL);
SemLock(SEMKEY_LOCK);
pSPoolCtl->iActProcNum --;
SemUnlock(SEMKEY_LOCK);
return 0;
}
/******************************************************************************
函数名称: IncValidProcNum
函数功能: 进程池中有效子进程 增加1
输入参数: 无
输出参数: 无
返 回 值: 0 -- 成功
<0 -- 失败
******************************************************************************/
int IncValidProcNum()
{
PoolCtrl *pSPoolCtl;
pSPoolCtl = (PoolCtrl *)ShmLink(SHMKEY_POOLCTRL);
SemLock(SEMKEY_LOCK);
pSPoolCtl->iValidProcNum ++;
SemUnlock(SEMKEY_LOCK);
return 0;
}
/******************************************************************************
函数名称: DecValidProcNum
函数功能: 进程池中有效子进程 减少1
输入参数: 无
输出参数: 无
返 回 值: 0 -- 成功
<0 -- 失败
******************************************************************************/
int DecValidProcNum()
{
PoolCtrl *pSPoolCtl;
pSPoolCtl = (PoolCtrl *)ShmLink(SHMKEY_POOLCTRL);
SemLock(SEMKEY_LOCK);
pSPoolCtl->iValidProcNum --;
SemUnlock(SEMKEY_LOCK);
return 0;
}
/******************************************************************************
函数名称: GetActProcNum
函数功能: 获取进程池中激活子进程数
输入参数: 无
输出参数: 无
返 回 值: 进程池中激活子进程
******************************************************************************/
int GetActProcNum()
{
PoolCtrl *pSPoolCtl;
pSPoolCtl = (PoolCtrl *)ShmLink(SHMKEY_POOLCTRL);
return pSPoolCtl->iActProcNum;
}
/******************************************************************************
函数名称: GetValidProcNum
函数功能: 获取进程池中有效子进程数
输入参数: 无
输出参数: 无
返 回 值: 进程池中激活子进程
******************************************************************************/
int GetValidProcNum()
{
PoolCtrl *pSPoolCtl;
pSPoolCtl = (PoolCtrl *)ShmLink(SHMKEY_POOLCTRL);
return pSPoolCtl->iValidProcNum;
}
/******************************************************************************
函数名称: GetInitProcNum
函数功能: 获取进程池中有效子进程数
输入参数: 无
输出参数: 无
返 回 值: 进程池中激活子进程
******************************************************************************/
int GetInitProcNum()
{
PoolCtrl *pSPoolCtl;
pSPoolCtl = (PoolCtrl *)ShmLink(SHMKEY_POOLCTRL);
return pSPoolCtl->iInitProcNum;
}
/******************************************************************************
函数名称: GetValidProcNum
函数功能: 获取进程池中有效子进程数
输入参数: 无
输出参数: 无
返 回 值: 进程池中激活子进程
******************************************************************************/
int GetIdleProcNum()
{
PoolCtrl *pSPoolCtl;
pSPoolCtl = (PoolCtrl *)ShmLink(SHMKEY_POOLCTRL);
return pSPoolCtl->iValidProcNum - g_SPoolCtrl->iActProcNum;
}
/******************************************************************************
函数名称: GetPoolStatus
函数功能: 获取进程池状态
输入参数: 无
输出参数: 无
返 回 值: 0 -- 不可用
1 -- 可用
******************************************************************************/
int GetPoolStatus()
{
PoolCtrl *pSPoolCtl;
pSPoolCtl = (PoolCtrl *)ShmLink(SHMKEY_POOLCTRL);
if(pSPoolCtl->EPoolStatus == PSTATUS_OFF)
{
return 0;
}
else
{
return 1;
}
}
/******************************************************************************
函数名称: SetPoolStatus
函数功能: 获取进程池状态
输入参数: PSTATUS_ON -- 进程池可用
PSTATUS_OFF -- 进程池不可用
输出参数: 无
返 回 值: 0 -- 正常
******************************************************************************/
static int SetPoolStatus(EPoolStatus status)
{
PoolCtrl *pSPoolCtl;
pSPoolCtl = (PoolCtrl *)ShmLink(SHMKEY_POOLCTRL);
pSPoolCtl->EPoolStatus = status;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -