Poco::Foundation库中涉及进程的内容主要包括了4个主题,分别是进程(Process)、进程间同步(inter-process synchronization)、管道(Pipes)、共享内存(Shared Memory)。我们都知道管道、共享内存、网络通讯是进程间数据交互的3种基本方式。由于网络通讯足够复杂,在Poco的结构划分里被单独分成了一个库Net,Foundation库中并没有涉及。下面一一介绍:
关于中的进程其实没有什么可说的,不管是其内部实现还是外部使用都非常的简单。内部实现上只不过是不同操作系统进程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)
Poco库中提供了Poco::NamedMutex和Poco::NamedEvent类用于进程间的同步。同线程间同步的类Mutex,Event相比,进程间同步都是命名的,这毫无疑问是因为操作系统的底层函数的要求。
其类图如下:
我们都知道管道是一个单向的通讯通道,或者用来读或者用来写。如果两个进程间要实现双向的通讯,必须在进程之间创建两个管道。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; }管道的类图如下:
在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)