poco中的进程使用的纠结

Poco库提供了方便的进程创建接口,允许子进程与父进程通过标准流通信,但强制重定向到父进程控制台,导致子进程依赖父进程且控制台管理复杂。在配置文件和字符编码支持上也存在不足,可能需要重新评估该库的适用性。

poco中的进程创建给予了很方便的接口:

std::string cmd("test.exe");  
std::vector<std::string> args;  
Poco::ProcessHandle ph = Process::launch(cmd, args);

只要给出文件名和命令行参数(一个vector<string>,内容可为空),即可创建进程运行.

这个接口有个特点:

static ProcessHandle launch(
    const std::string & command, //命令行命令,即文件名
    const Args & args,  //命令的参数
    const std::string & initialDirectory, //在该目录下创建进程
    Pipe * inPipe,  //该进程标准输入流
    Pipe * outPipe,  //该进程标准输出流
    Pipe * errPipe,  //该进程标准错误输出流
    const Env & env  
);

这是该接口完整的形式,其它重载最后都会把其它参数用默认值填上.

对于最后三个参数,该接口允许把新创建的子进程的三个标准流重定向到另一个流中,这个流可以是C++的任意输入输出流,即可以重定向到父进程创建的流中,通过一些库,甚至可以把网络也做为一个流,这是一个很有意思的功能,子进程可以很方便的与父进程进行通信,


但是这个重定向却有一个不能让人接受的地方:它肯定会重定向到父进程中...

当没有指定重定向时,如果父进程本身有控制台,则自动重定向到该控制台,即使父进程没有控制台,他也会利用GetConsoleWindow函数获取父进程控制台的句柄,即使看不到控制台窗口,子进程最后都要重定向到父进程的控制台上.

所以  :   不管你是否想要重定向到父进程里,这接口就只能重定向到父进程里......


结果出现两种问题:

1,这种实现导致子进程依赖父进程,只要父进程退出,控制台关闭,子进程输出的信息将无法看到

2,表面上子进程与父进程分别各用一个窗口,但是实际上两个窗口都是属于父进程的,当你为了关闭子进程而去错误的关闭控制台,父进程将直接关闭(即使有其它窗口),而且子进程实际上并没有关闭


我还没有过使用这个库的网络方面的功能,但是我已经使用过一些其它的简单功能,配置文件方面,它貌似只能读取ini文件,而不能写入,但是xml则可以读取和写入,字符编码方面,虽然提供了TextEncoding与其一堆子类,一般的转换都能支持,但这种方式却不支持中文,只有UnicodeConverter::toUTF8和UnicodeConverter::toUTF16两个接口能成功转换中文,但就为了能调用这两个接口,自己还要特意为了他们两写一套一个string和wstring的转换.....


如果这个库的网络方面以及其他方面的实现也如以上这些功能一样"缺边少角",或者说"想当然的实现,并没有考虑用户的使用"的话,那么我可能要重新考虑对这个库的态度了..


最后,我只能继续使用系统API来创建我的进程....

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值