本文用的是#include <cutils/uevent.h>
主要讲述android中怎么在C++层接收uevent
uevent 是 kernel层向用户层发送的一个事件
首先创建一个线程用于循环去获取uevent
void testUevent {//创建一个线程一直循环pthread_t thread;int ret = pthread_create(&thread, nullptr, getAndPraseUevent, nullptr);if (ret != 0) {ALOGD("Failed to create thread1");return;}//与主线程分离pthread_detach(thread);}
然后在这个线程中就可循环获取uevent了,本文是通过NetLink的方式获取
static void parseUevent(const char *msg)
{while (*msg) { // 循环遍历 uevent 消息字符串if (!strncmp(msg, "key=mykey111", 12)) { // 如果字符串开头为 "key=mykey111"ALOGD("get msg = %s", msg); // 输出日志信息,表示获取了 msg}// 继续遍历下一个字符while(*msg++);}
}static void* getAndPraseUevent(void*) {char msg[UEVENT_MSG_LEN+2]; // 定义一个字符数组用于存储 uevent 消息int size;int socket_fd = -1; // 定义 socket 文件描述符,并初始化为 -1socket_fd = uevent_open_socket(64*1024, true); // 打开 uevent socket,设置缓冲区大小为 64KBif (socket_fd < 0) {ALOGD("socket_fd is error!"); // 输出日志,表示 socket_fd 错误return nullptr; // 返回 nullptr}// 设置 socket_fd 为非阻塞模式fcntl(socket_fd, F_SETFL, O_NONBLOCK);while (true) {size = uevent_kernel_multicast_recv(socket_fd, msg, UEVENT_MSG_LEN); // 接收 uevent 消息if (size <= 0)continue;msg[size] = '\0'; // 在消息末尾添加字符串结束符msg[size + 1] = '\0'; // 在消息末尾再添加一个字符串结束符,用于处理特殊情况parseUevent(msg); // 解析 uevent 消息}return nullptr;
}