ACE进程管理

本文介绍ACE库中的进程管理功能,包括ACE_Process和ACE_Process_Manager类的使用方法,以及如何通过这些类创建、管理和终止进程。文章还展示了如何利用ACE_Reactor框架处理进程退出事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ACE把所有用于进程创建和控制的API都隐藏在ACE_Process包装类中.这个类允许程序员派生新的进程,继而等待新进程的终止.你通常会为每一个新进程使用一个ACE_Process类的对象,并且可以为新的子进程设置若干选项:
1、设置标准IO句柄;
2、指定两个进程间的句柄继承的工作方式;
3、设置子进程的环境块和命令行;
4、在Windows上指定各种安全属性,或在Unix上设置uid/gid/euid;
Unix 程序员应该注意,spawn()方法并没有与fork()系统调用类似的语意,而是与大多数Unix系统上都有的system()函数类似.你可以迫使 ACE_Process简单地调用fork(),但是在大多数情况下,如果需要,最好能使用ACE_OS::fork()来完成简单的进程分叉;
使用ACE_Process类创建进程,有两个步骤:
1、创建一个新的ACE_Process_Options类的对象,为新的子进程指定符合你需要的进程属性;
2、用ACE_Process::spawn()方法创建新的子进程;

ACE_Process_Options对象负责携带新进程所需要的各个选项.如果需要的话,一个选项对象可以用 于多个ACE_Process对象.栈上的ACE_Process对象,代表要创建的新进程.该进程对象会基于传入的选项对象创建新的子进 程.spawn()方法在UNIX上使用execvp()函数,在Windows上面会使用CreateProcess()函数.一旦创建了新的子进程, 父进程就会调用wait()方法来等待子进程的结束和退出.wait()方法会收集子进程的退出状态,并使得子进程在UNIX系统上不会成为僵尸进程.在 Windows系统上,wait()方法会使得CreateProcess()函数创建的进程和线程的HANDLE被关闭.
ACE_Process类的hook方法 :
1、 prepare()挂钩方法:在创建新的子进程之前,ACE_Process::spawn()方法会自动调用进程对象的 ACE_Process::prepare()方法,以做一些预先的处理;比如:我们可以检查并修改新进程的选项;要设置针对特定平台的选项,那么这种方 法是一种好方法;
如果prepare()方法返回0,则ACE_Process::spawn()方法会继续运行并创建新的子进程;如果prepare()方法返回-1,那么spawn()方法将不会再尝试创建新的子进程;
如果在非Windows平台上运行,我们还会设置我们想要子进程在运行时所使用的有效用户ID;
2、parent(pid_t child)挂钩方法:在fork()函数(UNIX平台)或CreateProcess()函数(Windows平台)被调用之后,这个挂钩方法会立刻在父进程中被回调;
3、 child(pid_t)挂钩方法:在fork()函数完成之后,后续的exec()被调用之前,这个挂钩方法会在子进程中被回调;注意:只有在你未在进 程选项的创建标记中指定ACE_Process_Options::NO_EXEC标记的情况下,exec()函数才会被调用,这也是默认情况;在 Windows平台上,child()方法不会被调用,因为Windows平台上没有fork()和exec()的概念;

4、 unmanage()挂钩方法:当ACE_Process_Manager管理的进程退出时,被ACE_Process_Manager调用。


安全参数 :
ACE_Process类对象的安全参数由ACE_Process_Options类的对象指定;

使用ACE的进程管理器:ACE_Process_Manager类 :
ACE_Process 类封装的是一个进程,每次也只能创建一个进程,也只能管理一个进程;当要创建一组进程并管理它们的时候,可以使用ACE提供的类 ACE_Process_Manager类来完成;这个类允许用户通过单次调用来创建多个子进程,并等待他们的结束、终止和退出;你还可以登记事件处理 器,让它们在子进程终止的时候被回调;
ACE_Process_Manager::spawn()方法与 ACE_Process::spawn()方法类似,要使用它们来创建进程,那么必须首先创建一个ACE_Process_Options类的对象 option,指定要创建的子进程的各项属性,并把这个类的对象option传递给spawn()方法.通过 ACE_Process_Manager::spawn_n()方法,可以一次创建多个子进程.你还可以等待所有的子进程退出,并收集它们的退出状态,同 时正确地移除它们所持有的所有资源.此外,你还可以强行终止先前由ACE_Process_Manager创建的进程;
使用 ACE_Process_Manager::spawn_n()创建N个子进程的时候,我们可以等待这N个子进程的退出;当我们调用 ACE_Process_Manager::terminate()方法显式地终止一个子进程的时候,这个子进程应该会立刻终止.terminate() 方法唯一的一个参数就是你想要终止的进程的进程ID.如果你传入的进程ID是0,那么这个进程管理器就会等待它所管理的任何一个进程退出.在UNIX平台 上,可能并不会像我们想象的那样工作良好,而最后收集到的可能并不是我们的进程管理器所管理的进程的退出状态.
注意 :在UNIX系统上,一旦调用terminate()方法之后,ACE_Process_Manager就会发出一个信号终止子进程;你可以通过检查进程的终止状态对此加以观察;
在 这N个子进程中,当完成了对第一个子进程的等待之后,父进程会使用进程管理器又一次执行阻塞式wait()调用,等待余下的所有子进程退出,依次类推,就 这样循环,直到等待最后一个子进程退出为止.为了表明这一要求,我们可以把0超时值传给wait()方法.注意:你还可以指定一个相对的超时时间值,我们 的阻塞式等待将在超时后返回.如果等待不成功并发生了超时,那么wait()调用会返回0; 
事件处理 :
大 多数时候,你会发现,父进程除了等待子进程退出之外,还有很多其它的事情要做,特别是如果你实现的是传统的网络服务器,它会创建很多子进程来完成繁重的网 络服务请求.在这种情况下,父进程除了要等待子进程退出并收集子进的退出状态之外,你还会想让父进程保持空闲,以处理更多的请求;
为了实现这种用例,ACE_Process_Manager的退出处理方法采用了特定的设计,能够与ACE_Reactor框架协同工作,以让Reactor框架在进程终止时调用终止回调处理器;
要 实现进程的终止回调处理器,我们必须为ACE_Event_Handler类实现一个子类,然后让这个子类作为进程的终止回调处理器;比如:我们实现的终 止回调处理器类为ExitHandler,并在ExitHandler类中实现一个终止处理方法handle_exit(ACE_Process* lpProcess);参数是一个指向ACE_Process类对像的指针lpProcess,它代表刚刚退出的进程.当进程退出的时候,反应器会同步地 调用事件处理器的handle_exit()方法,并把一个ACE_Process类对象的指针传递进来;
在底层发生的事情是 :
1、在POSIX平台上,ACE_Process_Manager为接收SIGCHLD信号做了登记.在接收到该信号的时候,ACE_Process_Manager使用反应器的通知机制在正常的进程上下文中重新获取控制;
2、 在Windows平台上,ACE_Process_Manager向反映器做了登记,以通过Reactor框架接收进程句柄上的事件通知.因为只有 ACE_WFMO_Reactor反映器实现了支持句柄上的事件通知功能,如果你在Windows平台上换用了其它的反映器,子进程的退出通知功能就无法工作;
当ACE_Process_Manager收到通知、并被告知子进程已经退出时,它会调用终止处理器ExitHandler的handle_exit()方法,进行终止处理;

 

关于ACE_Process类的例子 :

 

 

 

运行结果:

 

关于ACE_Process_Manager类的例子 :

 

 

运行结果:


内容概要:本文档详细介绍了在三台CentOS 7服务器(IP地址分别为192.168.0.157、192.168.0.158和192.168.0.159)上安装和配置Hadoop、Flink及其他大数据组件(如Hive、MySQL、Sqoop、Kafka、Zookeeper、HBase、Spark、Scala)的具体步骤。首先,文档说明了环境准备,包括配置主机名映射、SSH免密登录、JDK安装等。接着,详细描述了Hadoop集群的安装配置,包括SSH免密登录、JDK配置、Hadoop环境变量设置、HDFS和YARN配置文件修改、集群启动与测试。随后,依次介绍了MySQL、Hive、Sqoop、Kafka、Zookeeper、HBase、Spark、Scala和Flink的安装配置过程,包括解压、环境变量配置、配置文件修改、服务启动等关键步骤。最后,文档提供了每个组件的基本测试方法,确保安装成功。 适合人群:具备一定Linux基础和大数据组件基础知识的运维人员、大数据开发工程师以及系统管理员。 使用场景及目标:①为大数据平台建提供详细的安装指南,确保各组件能够顺利安装和配置;②帮助技术人员快速掌握Hadoop、Flink等大数据组件的安装与配置,提升工作效率;③适用于企业级大数据平台的建与维护,确保集群稳定运行。 其他说明:本文档不仅提供了详细的安装步骤,还涵盖了常见的配置项解释和故障排查建议。建议读者在安装过程中仔细阅读每一步骤,并根据实际情况调整配置参数。此外,文档中的命令和配置文件路径均为示例,实际操作时需根据具体环境进行适当修改。
在无线通信领域,天线阵列设计对于信号传播方向和覆盖范围的优化至关重要。本题要求设计一个广播电台的天线布局,形成特定的水平面波瓣图,即在东北方向实现最大辐射强度,在正东到正北的90°范围内辐射衰减最小且无零点;而在其余270°范围内允许出现零点,且正西和西南方向必须为零。为此,设计了一个由4个铅垂铁塔组成的阵列,各铁塔上的电流幅度相等,相位关系可自由调整,几何布置和间距不受限制。设计过程如下: 第一步:构建初级波瓣图 选取南北方向上的两个点源,间距为0.2λ(λ为电磁波波长),形成一个端射阵。通过调整相位差,使正南方向的辐射为零,计算得到初始相位差δ=252°。为了满足西南方向零辐射的要求,整体相位再偏移45°,得到初级波瓣图的表达式为E1=cos(36°cos(φ+45°)+126°)。 第二步:构建次级波瓣图 再选取一个点源位于正北方向,另一个点源位于西南方向,间距为0.4λ。调整相位差使西南方向的辐射为零,计算得到相位差δ=280°。同样整体偏移45°,得到次级波瓣图的表达式为E2=cos(72°cos(φ+45°)+140°)。 最终组合: 将初级波瓣图E1和次级波瓣图E2相乘,得到总阵的波瓣图E=E1×E2=cos(36°cos(φ+45°)+126°)×cos(72°cos(φ+45°)+140°)。通过编程实现计算并绘制波瓣图,可以看到三个阶段的波瓣图分别对应初级波瓣、次级波瓣和总波瓣,最终得到满足广播电台需求的总波瓣图。实验代码使用MATLAB编写,利用polar函数在极坐标下绘制波瓣图,并通过subplot分块显示不同阶段的波瓣图。这种设计方法体现了天线阵列设计的基本原理,即通过调整天线间的相对位置和相位关系,控制电磁波的辐射方向和强度,以满足特定的覆盖需求。这种设计在雷达、卫星通信和移动通信基站等无线通信系统中得到了广泛应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值