

OpenHarmony恢复启动子系统init进程之启动FD代持服务-开源基础软件社区-51CTO.COM
source link: https://ost.51cto.com/posts/17030
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

OpenHarmony恢复启动子系统init进程之启动FD代持服务 原创 精华
FD代持是按需启动的一个辅助扩展机制,按需启动进程可以保持退出前的fd状态句柄不丢失。按需启动进程退出前可将fd发送给init代持,再次启动后再从init获取fd。
代持原理:

代持流程:
按需启动进程退出前可将fd发送给init代持,再次启动后再从init获取fd。
init提供了相关接口供服务调用,服务进程退出前调用接口将fd通过支持IPC通信的socket发送给init代持,待该服务重新启动时,init将持有的该服务相关的fd句柄通过同样的方式返回给服务。

消息格式:
方法 | 说明 |
---|---|
hold | 由子服务发送给fdholder 服务,然后交给init进程代持 |
get | 子服务请求fdholder,由fdholder返还fd给子服务 |
为避免其他进程访问,都需要验证gid,uid,pid。 |
发布fdholder
正常情况下,fd 是不能在进程间传递的,但是可以通过发布fd来达到目的。
代码:
{
INIT_ERROR_CHECK(service != NULL, return, "Publish hold fds with invalid service");
char fdBuffer[MAX_FD_HOLDER_BUFFER] = {};
if (service->fdCount > 0 && service->fds != NULL) {
size_t pos = 0;
for (size_t i = 0; i < service->fdCount; i++) {
/**
* 技术要点1: dup(fd) 重定向fd,同时会清除O_CLOEXEC
* O_CLOEXEC 标志本来用于防止fd泄露给子进程,这里清除这个标志,就是因为发布就是为了给子进程使用。
*/
int fd = dup(service->fds[i]);
if (fd < 0) {
INIT_LOGE("Duplicate file descriptors of Service \' %s \' failed. err = %d", service->name, errno);
continue;
}
if (snprintf_s((char *)fdBuffer + pos, sizeof(fdBuffer) - pos, sizeof(fdBuffer) - 1, "%d ", fd) < 0) {
INIT_LOGE("snprintf_s failed err=%d", errno);
return;
}
pos = strlen(fdBuffer);
}
fdBuffer[pos - 1] = '\0'; // Remove last ' '
INIT_LOGI("fd buffer: [%s]", fdBuffer);
/**
* 技术要点2: 发布fds, 实际就是将fd设置到环境变量。在当前进程或子进程通过环境变量访问。
* #define ENV_FD_HOLD_PREFIX "OHOS_FD_HOLD_" ,通过getenv("OHOS_FD_HOLD_fdfdfd")就能
* 获取所有发布的fd。
*/
char envName[MAX_BUFFER_LEN] = {};
(void)snprintf_s(envName, MAX_BUFFER_LEN, MAX_BUFFER_LEN - 1, ENV_FD_HOLD_PREFIX"%s", service->name);
if (setenv(envName, fdBuffer, 1) < 0) {
INIT_LOGE("Failed to set env %s", envName);
}
INIT_LOGI("File descriptors of Service \' %s \' published", service->name);
}
}
就是发布一个环境变量,名称为: OHOS_FD_HOLD_servername, 将fd(可能有多个) 转变成字符串作为环境变量的值。 启动子服务进程之后,先去查找环境变量,获取它的值,分解出fd。
Recommend
-
13
首页 > 文章详情 代持,爆雷,维权…这个城市的热钱外溢 格隆汇楼市 昨天17:55 你会以怎样的方式迎接2021年?我想,我可能是继续为大家送上“2020年深圳楼市十大关键词(...
-
7
和达科技股份代持被问询 业绩及现金流遭"双杀" Connect with us 和达科技净利润...
-
6
商界早知道丨四川发布代持购房等风险提示 - 精选 - 商界网 | 商界APP-专注于商人-企业以及商业思维商界早知道丨四川发布代持购房等风险提示 商界新媒体...
-
6
聚和股份答科创板首轮20问,收购三星资产、代持、研发费用等被关注 在科创板首轮问询中,上交所主要关注聚和股份营业收入、收购三星资产、主要客户、销售费用率、实控人及其一致行动人、代持与核心技术人员、入股...
-
9
从我个人的理解来看,Android的Input系统其实就是系统级的事件处理、分发框架,它需要的功能模块大致有:事件读取、事件分类、事件分发。那么我们就从整个Input系统的输入源入手,了解事件是如何被输入到Input系统中的。 在看代码前我们先想一想,如果要...
-
12
作者:吴文璐 1 DFX简介 DFX(Design for X)子系统是为了提升软件质量设计的工具集,目前包含的内容主要有:DFR(Design for Reliability,可靠性)和DFT(Design for Testability,可测试性)特性。 目前标准系统已实现以下功能:
-
10
想了解更多内容,请访问:
-
6
必贝特答复科创板首轮问询,代持、研发费用等13个问题被问及 在首轮问询中,上交所主要关注必贝特核心产品临床试验、核心产品市场空间和商业化安排、核心技术、控制权和一致行动协议、代持、合作研发、研发费...
-
5
V2EX › 问与答 请教 V 友,很多年同学想让我帮忙股权代持,这个有什么风险和需要注意的地方?
-
5
想了解更多关于开源的内容,请访问:...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK