本文主要是介绍解决android系统唤醒时间偏长------healthd里的epoll以及socket,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在healthd中,有一个很好的例子,特地截取下来作为参考:
首先是
static int uevent_fd;
static int eventct;
static int epollfd;
int uevent_open_socket(int buf_sz, bool passcred)
{
struct sockaddr_nl addr;
int on = passcred;
int s;
memset(&addr, 0, sizeof(addr));
addr.nl_family = AF_NETLINK;
addr.nl_pid = getpid();
addr.nl_groups = 0xffffffff;
s = socket(PF_NETLINK#协议族, SOCK_DGRAM | SOCK_CLOEXEC#指定的socket类型-无保障的面向消息的socket, NETLINK_KOBJECT_UEVENT#特殊的uevent类型的socket);
if(s < 0)
return -1;
setsockopt(s, SOL_SOCKET, SO_RCVBUFFORCE, &buf_sz, sizeof(buf_sz));
setsockopt(s, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on));
#
#
if(bind(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
#
参数sockfd
#
close(s);
return -1;
}
return s;
}
static void uevent_init(void) {
uevent_fd = uevent_open_socket(64*1024, true);
if (uevent_fd < 0) {
KLOG_ERROR(LOG_TAG, "uevent_init: uevent_open_socket failed\n");
return;
}
fcntl(uevent_fd, F_SETFL, O_NONBLOCK);
#fcntl()针对(文件)描述符提供控制.参数fd 是被参数cmd操作(如下面的描述)的描述符
if (healthd_register_event(uevent_fd, uevent_event)) //收到event之后的处理函数
KLOG_ERROR(LOG_TAG,
"register for uevent events failed\n");
// close(uevent_fd);
}
int healthd_register_event(int fd, void (*handler)(uint32_t)) {
struct epoll_event ev;
ev.events = EPOLLIN | EPOLLWAKEUP;
ev.data.ptr = (void *)handler;
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &ev) == -1) {
#该函数用于控制某个epoll文件描述符上的事件,可以注册事件,修改事件,删除事件
KLOG_ERROR(LOG_TAG,
"epoll_ctl failed; errno=%d\n", errno);
return -1;
}
eventct++;
return 0;
}
static void healthd_mainloop(void) {
while (1) {
struct epoll_event events[eventct];
int nevents;
int timeout = awake_poll_interval;
nevents = epoll_wait(epollfd, events, eventct, timeout);
}
这样就把uevent和socket以及处理的handler联系到了一起
这篇关于解决android系统唤醒时间偏长------healthd里的epoll以及socket的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!