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

📄 propool.c

📁 在linux下面关于实现进程池的实例解析
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -