×
Namespaces

Variants
Actions

在进程间共享受保护的核心资源

From Nokia Developer Wiki
Jump to: navigation, search
Article Metadata

文章
huwell 在 29 Dec 2007 创建
最后由 hamishwillee 在 15 Dec 2011 编辑
  • 开发伙伴平台:

S60 3rd Edition


  • 详细描述

有时我们需要在不同的进程间共享一些受保护的核心资源,如RMutex, RChunk, RSemaphore等。他们即可以是Parent-Child关系,也可以是Client-Server关系。


  • 解决方案

Parent-Child关系

要在这样的情况下共享受保护的核心资源,如RSemaphore, RChunk, RBusLogicalChannel, RSessionBase,和RMutex等,就只有使用RProcess::SetParameter()这个API。下面是一个

简单的示例,演示了如何从parent传递资源到child进程:

    // In the parent process:
 
RProcess proc;
 
// KChildProcess is process to be launched.
 
User::LeaveIfError( proc.Create( KChildProcess, KNullDesC,EOwnerThread ) );
 
CleanupClosePushL( proc );
 
proc.SetParameter( 7, iSch ); // iSch is the handle to be passed
 
// 7 is the environmental data slot
 
proc.Resume();
 
// In the child process:
 
iSch.Open( 7, EOwnerProcess ); // iSch is the handle to be obtained


Client-Server关系:

要在这样的环境下传递受保护的核心资源,如RSemaphore, RChunk, RBusLogicalChannel, RSessionBase和RMutex对象,可以通过Client/Server通信。


可以通过如下方法完成;

拥有上述对象的client进程可向server传递TIpcArgs包,其中就有RHandleBase参数,server便可以获得这些对象的使用。而server可以通过在相关资源类上调用如下方法来打开句柄:

Open( RMessagePtr2 aMessage, TInt aParam, TOwnerType aType=EOwnerProcess );


其中aMessage参数为server从client接收到的信息,而aParam应为数字(0-3),指名消息参数持有client的句柄。


server可以使用资源对象作为参数,完成一个client message,并返回一个句柄给client:

RMessagePtr2::Complete( RHandleBase aHandle );

client应该检查返回值,如果是负值则表明这是一个错误值。正值是一个句柄可以用来初始化一个相关的R对象,通过调用RHandleBase::SetHandle来实现:


除此之外,你也可以使用下列方法完成:

TInt RHandleBase::SetReturnedHandle( TInt aHandleOrError );

aHandleOrError是server返回的值,这个方法会检查该值是否为一个句柄。

This page was last modified on 15 December 2011, at 09:18.
25 page views in the last 30 days.