c语言长按键后开关机程序,C程序实现监听长按物理power键3秒关机功能
要实现的功能:在android Framework层被裁剪掉的情况下,实现监听长按的物理power按键,实现长按3秒后关机功能;
思路:使用event epoll,非阻塞式IO操作,同时避免无差别轮询,做到避免忙轮和无差别轮询提高效率;
要用到的epoll函数:epoll_create(EPOLL_SIZE_HINT);
epoll_wait(mEpollFd, mPendingEventItems, 8, -1);
epoll_ctl(mEpollFd, EPOLL_CTL_ADD, fd, &eventItem)
epoll_ctl(mEpollFd, EPOLL_CTL_DEL, fd, &eventItem);
下面是实现的过程:int main(int argc, char *argv[])
{
ALOGI("robot test robot power");
struct itimerval old_value;
int tap_power_time = 0;
int tap_power_type = 0;
int tap_power_code = 0;
int tap_power_value = 0;
struct itimerval tick;
int mEpollFd;
const int EPOLL_SIZE_HINT = 8;
const char* DEV_INPUT = "/dev/input/event1";
struct epoll_event mPendingEventItems[8];
unsigned char buf[1024] = {0};
struct inotify_event *event = NULL;
struct RawEvent* readBuffer = (struct RawEvent*) malloc (sizeof(struct RawEvent));
mEpollFd = epoll_create(EPOLL_SIZE_HINT);
int fd = open(DEV_INPUT, O_RDWR | O_CLOEXEC);
/*
* struct epoll_event {
*uint32_t events; // epoll events (bit mask)
*epoll_data_t data; // User data
* };
*/
struct epoll_event eventItem;
memset(&eventItem, 0, sizeof(eventItem));
/**
* EPOLLIN: has data to read
* EPOLLOUT: has data to write
*/
eventItem.events = EPOLLIN;
/**
* EPOLL_CTL_ADD: add fd to watching list
* EPOLL_CTL_DEL: remove fd from watching list
*/
if (epoll_ctl(mEpollFd, EPOLL_CTL_ADD, fd, &eventItem) == -1)
{
exit(0);
}
for (;;)
{
/**
* parameter -1 : wait until event occur ;
* 0 : return immediately when deal with a non-block event
*/
epoll_wait(mEpollFd, mPendingEventItems, 8, -1);
int32_t readSize = read(fd, readBuffer, sizeof(struct input_event));
struct input_event *event =(struct input_event*) readBuffer;
tap_power_time = (int) event->time.tv_sec;
tap_power_type = event->type;
tap_power_code = event->code;
tap_power_value = event->value;
if(is_power_down_key(tap_power_type, tap_power_code, tap_power_value))
{
ALOGI("robot power down key");
signal(SIGALRM,handle_exit);
memset(&tick,0,sizeof(tick));
tick.it_value.tv_sec= 3;
tick.it_value.tv_usec= 0;
setitimer(ITIMER_REAL,&tick,NULL);
}
else if(is_power_up_key(tap_power_type, tap_power_code, tap_power_value))
{
tick.it_value.tv_sec= 0;
tick.it_value.tv_usec= 0;
setitimer(ITIMER_REAL,&tick,NULL);
}
}
epoll_ctl(mEpollFd, EPOLL_CTL_DEL, fd, &eventItem);
return 0;
}struct RawEvent {
int32_t when;
int32_t deviceId;
int32_t type;
int32_t code;
int32_t value;
};
void handle_exit(int sig)
{
ALOGI("robot 3 second time out ,now shutdown!");
system("reboot -p");
}
int is_power_down_key(int type, int code, int value)
{
int is_down = 0;
is_down = (type == 1) && (code == 116) && (value == 1);
return is_down;
}
int is_power_up_key(int type, int code, int value)
{
int is_up = 0;
is_up = (type == 1) && (code == 116) && (value == 0);
return is_up;
}
c语言长按键后开关机程序,C程序实现监听长按物理power键3秒关机功能相关推荐
- Uniapp-微信小程序实现全局事件监听并进行数据埋点
Uniapp-微信小程序实现全局事件监听并进行数据埋点 零.前言 最近接到需求,领导希望使用微信开放平台上免费的We分析进行数据埋点,但又不希望在现有uniapp开发的微信小程序代码上做侵入式修改,笔 ...
- oracle11g监听程序启动,Oracle11g无监听程序解决办法
Oracle11g无监听程序解决办法 一.监听器(LISTENER) 监听器是Oracle基于服务器端的一种网络服务,主要用于监听客户端向数据库服务器端提出的连接请求.既然是基于服务器端的服务,那么它 ...
- 小程序组件中的监听事件
小程序组件中的监听事件 需求: 微信小程序中,如果进行使用了component级的组件的话,在一些情况下,父组件中使页面中的数据进行变化,子组件中 的数据不会一起变化,由此可以使用该方法 方法: 使用 ...
- android点击不抬起,Android小坑-OnTouchListener()事件监听长按后抬手MotionEvent.ACTION_MOVE不触发问题...
场景: 控件使用OnTouchListener()事件监听,正常的流程是,按下瞬间屏幕捕捉到触摸,触发MotionEvent.ACTION_DOWN事件,滑动屏幕会触发MotionEvent.ACTI ...
- android监听程序被杀死,Android 监听主进程被杀
当按多任务键时,然后清除所有程序或者杀死单个程序时,如果要监听这个动作的话,可以在一个service里监听. 效果如下: 可以看到,在多任务窗口中,左滑结束进程和清除所有进程后,都会自己再打开应用,代 ...
- 微信小程序实现watch属性监听数据变化
Vue 提供了一种通用的方式来观察和响应 Vue 实例上的数据变动:监听属性 watch. 虽然watch的滥用会导致性能不佳,但在一些情况下我们还是需要watch,使得代码更加简洁.逻辑更加清晰(其 ...
- 链接oracle 无监听程序,连接ORACLE 无监听程序
首先检查 计算机管理 -> 服务 -> OracleOraDa10g_home1TNSListener 是否启动,最好重启试试. 再检查其他服务是否正常.如果没有问题还是无法连接. 在 ...
- Liferay7 BPM门户开发之4: Activiti事件处理和监听Event handlers
事件机制从Activiti 5.15开始引入,这非常棒,他可以让你实现委托. 可以通过配置添加事件监听器,也可以通过Runtime API加入注册事件. 所有的事件参数子类型都来自org.activi ...
- C# 控制台或者winform程序开启http的监听状态
1 public class THttpListener 2 { 3 HttpListener listerner; 4 /// <summary> 5 /// 6 /// </su ...
最新文章
- Android Application 之 allowBackup 属性浅析
- Py:利用pyautogui实现自动将pdf文件(需手动设定pdf总页数)自动翻页并截取另存为图片形式,或自动隔0.1秒自动截笔记本全屏保存到指定文件夹
- Entityframework:启用延时加载的主意事项(只为强化记忆)
- ITK:读取DICOM系列并写入3D图像
- Django 源码阅读
- .net p/invoke 异常处理
- CentOS6.4下Mysql数据库的安装与配置
- 如何让开关打开_汽车油箱盖如何打开?老司机:不外乎这三种方式
- JAVA数组子集_【Java虚拟机】JVM系列学习之JVM体系(一)
- linux SPI操作LCD12864液晶
- 《系统集成项目管理》第五章 项目立项管理
- oppo手机怎么投射到电脑屏幕上
- js 字符串常用方法 切割 搜索 验证 替换
- 【屏幕适配】像素密度 分辨率 dp px的关系
- 苹果商城怎么调成中文_海豚加速器拳头账号中文注册下载-海豚加速器拳头账号注册下载 v2020...
- 常用复原reast.css
- android入门之系统架构和环境搭建
- 源码角度分析Rebuild和Rebatch
- 1. Arthas的命令
- 阿里云服务器挖矿程序解决流程
热门文章
- 博士申请 | 哥本哈根大学招收机器学习和信息检索全奖博士生(年薪34万)
- 脑洞大开的机器视觉多领域学习模型结构 | CVPR 2018论文解读
- PaperWeekly社区 | 知识图谱 vs. 对话系统专题讨论
- 动态规划解题套路框架
- vc++ 6.0 创建程序快捷方式的一个例子源码_漏洞复现:phpcms v9.6.0任意文件上传漏洞(CVE201814399)...
- mfc 判断文件夹复制完成_Python办公自动化|自动整理文件,一键完成!
- Mybatis-typeAliases的作用
- 浙江省第二届大学生网络与信息安全竞赛在线预赛
- Machine Schedule
- Bear and Strings