1# ChildProcess 2 3 4## 概述 5 6提供子进程的管理能力,支持创建Native子进程并在父子进程间建立IPC通道,用于实现多进程应用开发。 7 8**系统能力:** SystemCapability.Ability.AbilityRuntime.Core 9 10**起始版本:** 12 11 12 13## 汇总 14 15 16### 文件 17 18| 名称 | 描述 | 19| ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------ | 20| [native_child_process.h](native__child__process_8h.md) | 支持创建Native子进程,并在父子进程间建立IPC通道。<br>引用文件:<AbilityKit/native_child_process.h><br>库:libchild_process.so<br> | 21 22### 类型定义 23 24| 名称 | 描述 | 25| ------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------- | 26| typedef enum Ability_NativeChildProcess_ErrCode [Ability_NativeChildProcess_ErrCode](#ability_nativechildprocess_errcode) | 定义Native子进程模块错误码。 | 27| typedef void(\* [OH_Ability_OnNativeChildProcessStarted](#oh_ability_onnativechildprocessstarted)) (int errCode, OHIPCRemoteProxy \*remoteProxy) | 定义通知子进程启动结果的回调函数。 | 28 29 30### 枚举 31 32| 名称 | 描述 | 33| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------- | 34| [Ability_NativeChildProcess_ErrCode](#ability_nativechildprocess_errcode) {<br> NCP_NO_ERROR = 0,<br> NCP_ERR_INVALID_PARAM = 401,<br> NCP_ERR_NOT_SUPPORTED = 801,<br> NCP_ERR_INTERNAL = 16000050,<br> NCP_ERR_BUSY = 16010001,<br> NCP_ERR_TIMEOUT = 16010002,<br> NCP_ERR_SERVICE_ERROR = 16010003,<br> NCP_ERR_MULTI_PROCESS_DISABLED = 16010004,<br> NCP_ERR_ALREADY_IN_CHILD = 16010005,<br> NCP_ERR_MAX_CHILD_PROCESSES_REACHED = 16010006,<br> NCP_ERR_LIB_LOADING_FAILED = 16010007,<br> NCP_ERR_CONNECTION_FAILED = 16010008<br>} | 定义Native子进程模块错误码。 | 35 36 37### 函数 38 39| 名称 | 描述 | 40| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | 41| int [OH_Ability_CreateNativeChildProcess](#oh_ability_createnativechildprocess) (const char \*libName, [OH_Ability_OnNativeChildProcessStarted](#oh_ability_onnativechildprocessstarted) onProcessStarted) | 创建子进程并加载参数中指定的动态链接库文件,进程启动结果通过回调参数异步通知,需注意回调通知为独立线程,回调函数实现需要注意线程同步,且不能执行高耗时操作避免长时间阻塞。 | 42 43> **说明:** 44> 45> 当前仅支持2in1设备,且单个进程只能启动一个Native子进程。 46 47## 类型定义说明 48### OH_Ability_OnNativeChildProcessStarted 49 50``` 51typedef void (*OH_Ability_OnNativeChildProcessStarted)(int errCode, OHIPCRemoteProxy *remoteProxy) 52``` 53 54**描述** 55 56通知子进程启动结果的回调函数。 57 58**起始版本:** 12 59 60**参数:** 61 62| 名称 | 描述 | 63| ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | 64| errCode | NCP_NO_ERROR - 创建子进程成功<br>NCP_ERR_LIB_LOADING_FAILED - 加载动态库文件失败或动态库中未实现必要的导出函数<br>NCP_ERR_CONNECTION_FAILED - 动态库中实现的OnConnect方法未返回有效的IPC Stub指针<br>详见[Ability_NativeChildProcess_ErrCode](#ability_nativechildprocess_errcode)定义。 | 65| remoteProxy | 子进程的IPC对象指针,出现异常时可能为nullptr; 使用完毕后需要调用[OH_IPCRemoteProxy_Destory](../apis-ipc-kit/_o_h_i_p_c_remote_object.md#oh_ipcremoteproxy_destroy)方法释放。 | 66 67**参见:** 68 69[OH_Ability_CreateNativeChildProcess](#oh_ability_createnativechildprocess) 70 71[OH_IPCRemoteProxy_Destory](../apis-ipc-kit/_o_h_i_p_c_remote_object.md#oh_ipcremoteproxy_destroy) 72 73 74 75## 枚举类型说明 76 77### Ability_NativeChildProcess_ErrCode 78 79``` 80enum Ability_NativeChildProcess_ErrCode 81``` 82 83**描述** 84 85定义Native子进程模块错误码。 86 87**起始版本:** 12 88 89| 枚举值 | 描述 | 90| ----------------------------------- | ----------------------------------------------- | 91| NCP_NO_ERROR | 操作成功。 | 92| NCP_ERR_INVALID_PARAM | 无效参数。 | 93| NCP_ERR_NOT_SUPPORTED | 不支持创建Native子进程。 | 94| NCP_ERR_INTERNAL | 内部错误。 | 95| NCP_ERR_BUSY | 在Native子进程的启动过程中不能再次创建新的子进程,可以等待当前子进程启动完成后再次尝试。 | 96| NCP_ERR_TIMEOUT | 启动Native子进程超时。 | 97| NCP_ERR_SERVICE_ERROR | 服务端出错。 | 98| NCP_ERR_MULTI_PROCESS_DISABLED | 多进程模式已关闭,不允许启动子进程。 | 99| NCP_ERR_ALREADY_IN_CHILD | 不允许在子进程中再次创建进程。 | 100| NCP_ERR_MAX_CHILD_PROCESSES_REACHED | 到达最大Native子进程数量限制,不能再创建子进程。 | 101| NCP_ERR_LIB_LOADING_FAILED | 子进程加载动态库失败,文件不存在或者未实现对应的方法并导出。 | 102| NCP_ERR_CONNECTION_FAILED | 子进程调用动态库的OnConnect方法失败,可能返回了无效的IPC对象指针。 | 103 104 105## 函数说明 106 107### OH_Ability_CreateNativeChildProcess 108 109``` 110int OH_Ability_CreateNativeChildProcess (const char *libName, OH_Ability_OnNativeChildProcessStarted onProcessStarted ) 111``` 112 113**描述**: 114 115创建子进程并加载参数中指定的动态链接库文件,进程启动结果通过回调参数异步通知,需注意回调通知为独立线程,回调函数实现需要注意线程同步,且不能执行高耗时操作避免长时间阻塞。 116 117参数所指定的动态库必须实现并导出下列函数: 118 119 1. OHIPCRemoteStub* NativeChildProcess_OnConnect() 120 2. void NativeChildProcess_MainProc() 121 122处理逻辑顺序如下列伪代码所示: 123 124 主进程: 125 1. OH_Ability_CreateNativeChildProcess(libName, onProcessStartedCallback) 126 127 子进程 : 128 2. dlopen(libName) 129 3. dlsym("NativeChildProcess_OnConnect") 130 4. dlsym("NativeChildProcess_MainProc") 131 5. ipcRemote = NativeChildProcess_OnConnect() 132 6. NativeChildProcess_MainProc() 133 134 主进程 : 135 7. onProcessStartedCallback(ipcRemote, errCode) 136 137 子进程 : 138 8. 在NativeChildProcess_MainProc()函数返回后子进程退出。 139 140> **说明:** 141> 142> 当前仅支持2in1设备,且单个进程只能启动一个Native子进程。 143 144**起始版本:** 12 145 146**参数**: 147 148| 名称 | 描述 | 149| ------------------------ | --------------------------------------------------------------------------------------------------------------- | 150| libName | 子进程中加载的动态库文件名称,不能为nullptr。 | 151| onProcessStartedCallback | 通知子进程启动结果的回调函数指针,不能为nullptr,详见[OH_Ability_OnNativeChildProcessStarted](#oh_ability_onnativechildprocessstarted) | 152 153 154**返回**: 155 156执行成功返回NCP_NO_ERROR,失败返回错误码,详见[Ability_NativeChildProcess_ErrCode](#ability_nativechildprocess_errcode)。 157 158