模块契约环境变量
错误代码
xenverror 属于 xrt.environment 域:
XENV_ERROR_NAME:名称为空、包含=或不是合法 UTF-8。XENV_ERROR_VALUE:值不是合法 UTF-8,或系统返回了无法转换的值。XENV_ERROR_SYSTEM:操作系统环境 API 失败;xrtErrorSystemCode保留原生错误码。
内存不足继续使用统一的 XERR_MEMORY。全部错误都进入当前 XRT 错误执行上下文,因此上层宿主可以映射,C 调用方也可通过 xrtGetError 检查。
并发与外部修改
环境是进程级共享状态。XRT 自身的 POSIX 读取、设置和删除入口使用同一把内部短锁,读取返回独立副本,不会借用 getenv 的易失指针。直接调用 C 运行库或第三方库修改环境时,调用方仍应与这些外部操作自行同步。
示例
完整示例见 examples/system/environment/main.c 与 examples/environment/variants/main.c。
xenverror类型
环境变量错误代码在 xrt.environment 域内稳定。
| 值 | 语义 |
|---|---|
XENV_ERROR_NAME | 名称 |
XENV_ERROR_VALUE | 值非法 |
XENV_ERROR_SYSTEM | 系统调用失败 |
typedef enum xenverror { XENV_ERROR_NAME = 1, XENV_ERROR_VALUE, XENV_ERROR_SYSTEM } xenverror;
xrtEnvLookup函数
无歧义基础入口:查询过程成功返回 true,变量是否存在由输出指针区分。
bool xrtEnvLookup(cstr sName, str* psValue)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
sName | 输入 | 非空、不含 =、严格 UTF-8 | 变量名 |
psValue | 输出 | 非空 | 进入时先置 NULL;存在时为 xrtFree 释放的副本 |
返回值
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 查询成功;*psValue 非空 = 值副本,NULL = 变量不存在 | — |
false | 名称非法、系统失败或 OOM | *psValue 保持 NULL;错误经 xrtGetError() 报告 |
错误
XENV_ERROR_NAME— 名称非法XENV_ERROR_VALUE— 系统值无法转换为 UTF-8XENV_ERROR_SYSTEM— 环境 API 失败XERR_MEMORY— 副本分配失败
范例已编译验证
environment/variants · 缺失语义 · 不存在是成功状态(输出为空)
/* 不存在的变量:成功返回 + 空输出。 */
if ( xrtEnvLookup("XRT_DEFINITELY_MISSING", &sValue) ) {
printf("missing=ok\n");
}
xrtFree(sValue);
xrtEnvGet函数
常见路径的一行便捷入口;需要区分缺失和失败的代码应使用 xrtEnvLookup。
str xrtEnvGet(cstr sName)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
sName | 输入 | 非空、不含 =、严格 UTF-8 | 变量名 |
返回值
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 拥有式 UTF-8 副本(空变量值返回独立空串) | — |
NULL | 变量不存在或查询失败 | 失败时错误经 xrtGetError() 报告 |
错误
- 同
xrtEnvLookup(NAME/VALUE/SYSTEM/XERR_MEMORY)
范例已编译验证
system/environment · 拥有式读取 · 副本不受后续环境修改影响
sValue = xrtEnvGet("XRT_ENVIRONMENT_EXAMPLE");
if ( sValue == NULL ) {
return 2;
}
printf("value=%s\n", sValue);
xrtEnvSet函数
设置或覆盖进程级变量。
bool xrtEnvSet(cstr sName, cstr sValue)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
sName | 输入 | 非空、不含 =、严格 UTF-8 | 变量名 |
sValue | 输入 | 非空、严格 UTF-8;允许空串 | 新值 |
返回值
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已设置(子进程会继承) | — |
false | 名称/值非法、系统失败或 OOM | 环境不变;错误经 xrtGetError() 报告 |
错误
XENV_ERROR_NAME/XENV_ERROR_VALUE— 名称或值非法XENV_ERROR_SYSTEM— 设置 API 失败(Windows 用宽字符 API,不经 ANSI 代码页)XERR_MEMORY
范例已编译验证
system/environment · 全流程 · 真实进程环境生效
if ( !xrtEnvSet("XRT_ENVIRONMENT_EXAMPLE", "hello") ) {
return 1;
}
xrtEnvRemove函数
幂等删除变量;变量原本不存在仍返回 true。
bool xrtEnvRemove(cstr sName)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
sName | 输入 | 非空、不含 =、严格 UTF-8 | 变量名 |
返回值
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已删除或本就不存在(幂等) | — |
false | 名称非法或系统失败 | 错误经 xrtGetError() 报告 |
错误
XENV_ERROR_NAME— 名称非法XENV_ERROR_SYSTEM— 删除 API 失败
范例已编译验证
system/environment · 收尾 · 范例不留下全局副作用
return xrtEnvRemove("XRT_ENVIRONMENT_EXAMPLE") ? 0 : 3;
常量索引常量
以下常量在本页所属头文件中定义,语义见公共头注释。
| 常量 | 说明 |
|---|---|
| XENV_ERROR_NAME | 见头文件注释 |
| XENV_ERROR_SYSTEM | 见头文件注释 |
| XENV_ERROR_VALUE | 见头文件注释 |