POCO C++库学习和分析 -- 进程

POCO C++库学习和分析 -- 进程


       Poco::Foundation库中涉及进程的内容主要包括了4个主题,分别是进程(Process)、进程间同步(inter-process synchronization)、管道(Pipes)、共享内存(Shared Memory)。我们都知道管道、共享内存、网络通讯是进程间数据交互的3种基本方式。由于网络通讯足够复杂,在Poco的结构划分里被单独分成了一个库Net,Foundation库中并没有涉及。下面一一介绍:


1. 进程

       关于中的进程其实没有什么可说的,不管是其内部实现还是外部使用都非常的简单。内部实现上只不过是不同操作系统进程API的封装,下面是它的类图:



       在Poco中进程类的所有成员函数都是静态函数。主要的功能函数覆盖3个方面:

      1. 创建新进程

      2. 销毁其他进程

      3. 获取当前进程信息


       值得注意的是,在Poco中进程创建时,可以对进程的I/O进程重定向。其函数如下:

ProcessHandle Process::launch( const std::string& path, const std::vector<std::string>& args, Pipe* inPipe, Pipe* outPipe, Pipe* errPipe)


2.  进程间同步

       Poco库中提供了Poco::NamedMutex和Poco::NamedEvent类用于进程间的同步。同线程间同步的类Mutex,Event相比,进程间同步都是命名的,这毫无疑问是因为操作系统的底层函数的要求。

       其类图如下:



3. 管道

       我们都知道管道是一个单向的通讯通道,或者用来读或者用来写。如果两个进程间要实现双向的通讯,必须在进程之间创建两个管道。Poco库中也封装了管道方便进程通讯,但Poco库中对于管道的读写,却不是通过管道的本身,而是通过Poco::PipeOutputStream和Poco::PipeInputStream 两个类。这样的话,便可以实现和标准库流操作的无缝结合。

       下面是一个例子来说明这几者的关系:

#include "Poco/Process.h"
#include "Poco/PipeStream.h"
#include "Poco/StreamCopier.h"
#include <fstream>
using Poco::Process;
using Poco::ProcessHandle;
int main(int argc, char** argv)
{
	std::string cmd("/bin/ps");
	std::vector<std::string> args;
	args.push_back("-ax");
	Poco::Pipe outPipe;
	ProcessHandle ph = Process::launch(cmd, args, 0, &outPipe, 0);
	Poco::PipeInputStream istr(outPipe);
	std::ofstream ostr("processes.txt");
	Poco::StreamCopier::copyStream(istr, ostr);
	return 0;
}
       管道的类图如下:



4. 共享内存

       在Poco库中,Poco::SharedMemory类用于实现共享内存功能。它支持两种创建方式:

       1.从确定大小的内存区域

       2. 从文件(通过把文件映射入共享内存区域)


       而在接口上,Poco::SharedMemory只外露了两个接口:

char* begin() const;
char* end() const;
      begin()函数返回共享内存的起点,end()函数则返回其终点。下面是它的类图和两个使用例子,并不复杂:



      例子一:

// Map a file into memory
#include "Poco/SharedMemory.h"
#include "Poco/File.h"
using Poco::SharedMemory;
using Poco::File;
int main(int argc, char** argv)
{
	File f("MapIntoMemory.dat");
	SharedMemory mem(f, SharedMemory::AM_READ); // read-only access
	for (char* ptr = mem.begin(); ptr != mem.end(); ++ptr)
	{
		// ...
	}
	return 0;
}

      例子二:

// Share a memory region of 1024 bytes
#include "Poco/SharedMemory.h"
using Poco::SharedMemory;
int main(int argc, char** argv)
{
	SharedMemory mem("MySharedMemory", 1024,
		SharedMemory::AM_READ | SharedMemory::AM_WRITE);
	for (char* ptr = mem.begin(); ptr != mem.end(); ++ptr)
	{
		*ptr = 0;
	}
	return 0;
}


(版权所有,转载时请注明作者和出处  http://blog.csdn.net/arau_sh/article/details/8648181


     


posted @ 2013-03-10 10:53  在天与地之间  阅读(2142)  评论(0编辑  收藏  举报