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

📄 propool.c

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