从别处找来的,记一下,学习~
/*=============================================================================
#
# Description: 多进程的一个框架,大家可以直接使用,已经经过功能测试和压力测试。
# 编译:g++ forkwork_use.cpp -o forkwork_use
#
=============================================================================*/
#include <iostream>
#include <pthread.h>
#include <string>
#include <vector>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <map>
using namespace std;
//=============================================================================
typedef std::pair<pid_t,int> pidPair;
map<pid_t,int> g_MapPids;
int DoYourWork(int iIndex);
/**
* @brief 检查子进程情况(不需要改动)
*
* @param bNeedCon true:父进程发现子进程死掉就会重新拉起子进程;false:父进程在所有子进程都退出之后也会退出。
*
* @return 0 succ
* else fail
*/
int DetectPids(bool bNeedCon)
{
pid_t pid;
pid_t _n_pid;
int Ret;
for(;;)
{
//会阻塞在这里,等待有子进程退出
pid = waitpid(-1,NULL,0);
if ( pid < 0 )
{
sleep(1);
continue;
}
if(!bNeedCon)//等待结束
{
g_MapPids.erase(pid);
if(g_MapPids.size()==0)
return 0;
}
else//检测拉起
{
if(g_MapPids.count(pid)<=0)
{
sleep(1);
continue;
}
int index=g_MapPids.find(pid)->second;
g_MapPids.erase(pid);
_n_pid = fork();
if(_n_pid<0)
{
sleep(1);
continue;
}
else if ( _n_pid == 0 )
{
printf("i am child\n");
g_MapPids.clear();
Ret = DoYourWork(index);
return Ret;
}
else
{
printf("i am farther,child is %d,index is %d\n",_n_pid,index);
g_MapPids.insert(pidPair(_n_pid,index));
}
sleep(1);
}
}
return 0;
}
/**
* @brief 执行启动多个子进程的逻辑(不需要改动)
*
* @param forknum 子进程个数
* @param bNeedCon true:父进程发现子进程死掉就会重新拉起子进程;false:父进程在所有子进程都退出之后也会退出。
*
* @return 0 succ
* else fail
*/
int ForkWork(int forknum,bool bNeedCon)
{
g_MapPids.clear();
pid_t pid=0;
int Ret;
for(int i=0;i<forknum;++i)
{
pid=fork();
if(pid==-1)
return -1;//err
else if(pid==0)//child
{
//执行
printf("i am child\n");
g_MapPids.clear();
Ret = DoYourWork(i);
return Ret;
}
else
{
printf("i am farther,child is %d,index is %d\n",pid,i);
g_MapPids.insert(pair<pid_t,int>((pid_t)pid,(int)i));
}
}
printf("start all pids and start detect\n");
DetectPids(bNeedCon);
return 0;
}
/**
* @brief 用户需要执行的函数(需要用户实现)
*
* @param iIndex 给这个进程分配一个userId,存储在父进程的pid->userId的映射表里;主要目的是为了实现当子进程自己死掉,父进程可以重新根据map表传入这个userId
*
* @return 0 succ
* else fail
*/
int DoYourWork(int iIndex)
{
//do your own thing
sleep(5);
return 0;
}
int main(int argc,char ** argv)
{
if(argc < 2)
{
printf("please input maxforknum needCon(0/1)\n");
printf("eg. ./forkwork_use 10 1\n");
return 0;
}
int iForkNum=atoi(argv[1]);
bool bNeedCon=atoi(argv[2]);
ForkWork(iForkNum,bNeedCon);
}
分享到:
相关推荐
本资源提供的"多进程服务的框架源代码"是一个很好的学习和实践平台,尤其对于那些希望深入理解多进程编程和服务设计的开发者来说。下面将详细探讨多进程、服务以及源代码分析等相关知识点。 首先,我们来理解“多...
这个框架的核心目标是提供一个简单易用的API,使得开发者可以轻松地在不同的Android应用之间传递数据和执行操作。它通常会包含以下几个关键组成部分: 1. **Binder机制**:Android的跨进程通信基础是Binder机制。...
将多进程与Socket结合,我们可以创建一个多进程Socket服务器,每个连接由一个新的进程处理。`multiprocessing`模块的`Pool`类可以方便地管理一组进程,处理任务。例如: ```python from multiprocessing import ...
在处理大量数据或执行计算密集型任务时,利用多进程并行处理可以显著提高效率。"Python-一个进程级别的python并行框架" 提供了这样的解决方案,允许用户在进程层面并行运行任务,特别适合于深度学习的参数调整等耗时...
taskPHP是一个基于PHP的多进程定时任务框架,采用多进程技术实现任务的高效分配和执行。该项目支持多进程和多线程模式,推荐安装pthreads扩展以获得更佳性能,同时兼容Linux和Windows操作系统。项目包含39个文件,...
多进程意味着同时运行着多个这样的执行实例,每个实例可能在执行不同的任务或者协同完成一个复杂的系统功能。 在Windows或类似的GUI(图形用户界面)系统中,“窗口”是用户与应用程序交互的主要方式。每个窗口都...
人工智能-项目实践-嵌入式-基于Linux系统的应用程序,旨在搭建一套完整的多进程多线程通讯的消息框架. 支持多SOC的嵌入 架构设计核心思想: 统一、抽象、下沉、上升、量化、闭环。 统一:做到通用,标准化,如posix...
多进程架构是现代浏览器的一个核心特性,它将不同的浏览器功能分散到多个独立的进程中,从而避免一个进程崩溃影响整个浏览器。 Duilib是一个开源的Windows界面库,它为开发者提供了一套快速开发高效、美观的Windows...
QT框架中的多进程通信是开发复杂应用程序时的关键技术,它允许不同进程之间交换数据和执行协同操作。在本示例中,"QT 多进程通信"着重展示了如何使用QProcess和QSharedMemory来实现进程间的通信。 QProcess是QT库中...
"C#多进程浏览器-仿Chrome浏览器"是一个项目,它旨在模仿Google Chrome浏览器的设计理念,利用C#来实现一个支持多进程架构的浏览器。这个项目名为"MultiProcessArchitectureDemo-master",显然关注的是多进程架构这...
【Qt+VTK多进程,VTK窗口进程嵌入主进程】这个主题涉及到的是使用Qt框架与Visualization Toolkit(VTK)进行多进程编程,并将VTK的图形窗口集成到Qt的主应用程序中。Qt是一个流行的跨平台应用开发框架,而VTK则是一...
该项目为基于PHP的多进程内存共享定时计划任务框架设计源码,包含44个文件,涵盖32个PHP脚本、7个Markdown文档、1个JSON配置、1个日志文件、1个数据库文件、1个命令文件、1个模板文件。该框架利用PHP的多进程和内存...
### 详解主流浏览器多进程架构:Chrome、IE 随着互联网技术的飞速发展,Web浏览器已成为现代生活中不可或缺的一部分。然而,网络安全威胁也随之增加,包括恶意软件、木马、间谍软件等,对用户的安全和隐私构成了...
在这种背景下,`Android-MultiProcessRouter`应运而生,它是一个高效、易用的多进程路由框架,特别适用于多进程模块化的应用程序。 `Android-MultiProcessRouter`的核心功能是通过AnnotationProcessor(注解处理器...
总结起来,这个VB多进程示例程序提供了一个基础框架,展示了如何在VB环境中利用API调用来实现多进程操作,这对于需要并发执行任务或需要独立运行组件的VB开发者来说是非常有价值的参考资料。通过学习和理解这个示例...
采用多进程+IO复用提高并发处理能力 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:用PHP写的高并发服务器框架,支持...
Qt是一个跨平台的C++图形用户界面应用程序开发框架,而多进程爬虫则是一种并行处理策略,能够提升爬虫的抓取速度和效率。 首先,让我们深入理解Qt库。Qt提供了丰富的API,可以用于创建GUI应用、网络通信、数据库...
本主题将深入探讨Python3中四种不同的并发模型:同步依序下载、多进程(multiprocessing)、多线程(multithreading)以及asyncio异步编程,并通过理论分析和实际案例对比它们之间的效率差异。 1. 同步依序下载: ...
这样可以提高应用的响应性和稳定性,因为即使一个进程崩溃,另一个进程仍然可以继续运行。例如,一个后台服务可以在单独的进程中执行耗时任务,而UI进程则保持流畅,两者通过Messenger交换信息。 总结来说,基于...
在多进程环境中,如果一个进程(如后台计算进程)在主线程上执行耗时操作,那么UI更新就会被阻塞,造成用户界面无响应。解决这一问题的关键在于将计算密集型任务移到单独的进程中执行,让主线程专注于处理用户界面...