码迷,mamicode.com
首页 > 系统相关 > 详细

ACE进程管理

时间:2015-08-29 15:31:20      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:

1 控制台程序启动时传递给main的参数

控制台程序不管启动的时候是否有窗口,其参数都只有一个,那就是exe的全路径加exe的名字

//运行时不显示控制台窗口
#pragma comment(linker,"/subsystem:\"Windows\" /entry:\"mainCRTStartup\"")

#include <fstream>
using namespace std;


int main(int argc, char** argv)
{
    ofstream fout("data.txt");
    for (int i = 0;i<argc;++i)
    {
        fout<<"argc="<<i<<",argv["<<i<<"]="<<argv[i]<<endl;
    }
    return 0;
}

技术分享

进程可以理解成一个exe
控制台程序在启动运行的时候默认会调用

2 ACE_Process类

代表着一个进程的代理,可以通过ACE_Process_Options设置进程启动的参数,可以启动一个exe,可以获取进程退出的返回值,可以启动其他的子进程(由当前进程启动的进程就就当前进程的子进程)

下面的程序会启动一个进程,这个进程再递归启动子进程,从而实现计算10的阶乘,最终退出的进程将结果写入文件中。很有代表意义:

#ifdef _DEBUG
#pragma comment (lib,"ACEd.lib")
#else
#pragma comment (lib,"ACE.lib")
#endif

#include "ace/OS.h"
#include "ace/Log_Msg.h"
#include "ace/Process.h"
#include <fstream>
using namespace std;


int main(int argc, char** argv)
{
    //可移植的
    ACE_Process_Options options;

    int n = 10;

    //最高层的exe,程序第一次启动的那个exe
    if (argc == 1)
    {
        //调用子进程需要的命令行参数,第一个参数是当前exe名字说明还会再启动当前exe的副本,第二个参数是n-1
        options.command_line("%s %d",argv[0],n-1);
    }
    //到最后一个被启动的进程时,直接返回1
    else if (atoi(argv[1]) == 1)
    {
        return 1;//从这里就可以看出来main的返回值是干嘛的了吧
    } 
    else
    {
        //计算当前进程所属的n
        n = atoi(argv[1]);
        options.command_line("%s %d",argv[0],n-1);
    }

    ACE_Process child;
    //再启动一个当前exe的新副本,但是参数不同
    child.spawn(options);
    //child会等待新exe的退出之后再执行wait()之后的代码,wait()是可移植的
    child.wait();
    //当前进程所属的n乘以child创建的进程的返回值,作为当前进程的返回值
    ofstream fout("data.txt");
    int factorial = n* child.exit_code();
    fout<<factorial;
    return factorial;
}

技术分享

版权声明:本文为博主原创文章,未经博主允许不得转载。

ACE进程管理

标签:

原文地址:http://blog.csdn.net/calmreason/article/details/48087113

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!