要实现的功能:在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秒关机功能相关推荐

  1. Uniapp-微信小程序实现全局事件监听并进行数据埋点

    Uniapp-微信小程序实现全局事件监听并进行数据埋点 零.前言 最近接到需求,领导希望使用微信开放平台上免费的We分析进行数据埋点,但又不希望在现有uniapp开发的微信小程序代码上做侵入式修改,笔 ...

  2. oracle11g监听程序启动,Oracle11g无监听程序解决办法

    Oracle11g无监听程序解决办法 一.监听器(LISTENER) 监听器是Oracle基于服务器端的一种网络服务,主要用于监听客户端向数据库服务器端提出的连接请求.既然是基于服务器端的服务,那么它 ...

  3. 小程序组件中的监听事件

    小程序组件中的监听事件 需求: 微信小程序中,如果进行使用了component级的组件的话,在一些情况下,父组件中使页面中的数据进行变化,子组件中 的数据不会一起变化,由此可以使用该方法 方法: 使用 ...

  4. android点击不抬起,Android小坑-OnTouchListener()事件监听长按后抬手MotionEvent.ACTION_MOVE不触发问题...

    场景: 控件使用OnTouchListener()事件监听,正常的流程是,按下瞬间屏幕捕捉到触摸,触发MotionEvent.ACTION_DOWN事件,滑动屏幕会触发MotionEvent.ACTI ...

  5. android监听程序被杀死,Android 监听主进程被杀

    当按多任务键时,然后清除所有程序或者杀死单个程序时,如果要监听这个动作的话,可以在一个service里监听. 效果如下: 可以看到,在多任务窗口中,左滑结束进程和清除所有进程后,都会自己再打开应用,代 ...

  6. 微信小程序实现watch属性监听数据变化

    Vue 提供了一种通用的方式来观察和响应 Vue 实例上的数据变动:监听属性 watch. 虽然watch的滥用会导致性能不佳,但在一些情况下我们还是需要watch,使得代码更加简洁.逻辑更加清晰(其 ...

  7. 链接oracle 无监听程序,连接ORACLE 无监听程序

    首先检查 计算机管理 -> 服务 ->  OracleOraDa10g_home1TNSListener  是否启动,最好重启试试. 再检查其他服务是否正常.如果没有问题还是无法连接. 在 ...

  8. Liferay7 BPM门户开发之4: Activiti事件处理和监听Event handlers

    事件机制从Activiti 5.15开始引入,这非常棒,他可以让你实现委托. 可以通过配置添加事件监听器,也可以通过Runtime API加入注册事件. 所有的事件参数子类型都来自org.activi ...

  9. C# 控制台或者winform程序开启http的监听状态

    1 public class THttpListener 2 { 3 HttpListener listerner; 4 /// <summary> 5 /// 6 /// </su ...

最新文章

  1. Android Application 之 allowBackup 属性浅析
  2. Py:利用pyautogui实现自动将pdf文件(需手动设定pdf总页数)自动翻页并截取另存为图片形式,或自动隔0.1秒自动截笔记本全屏保存到指定文件夹
  3. Entityframework:启用延时加载的主意事项(只为强化记忆)
  4. ITK:读取DICOM系列并写入3D图像
  5. Django 源码阅读
  6. .net p/invoke 异常处理
  7. CentOS6.4下Mysql数据库的安装与配置
  8. 如何让开关打开_汽车油箱盖如何打开?老司机:不外乎这三种方式
  9. JAVA数组子集_【Java虚拟机】JVM系列学习之JVM体系(一)
  10. linux SPI操作LCD12864液晶
  11. 《系统集成项目管理》第五章 项目立项管理
  12. oppo手机怎么投射到电脑屏幕上
  13. js 字符串常用方法 切割 搜索 验证 替换
  14. 【屏幕适配】像素密度 分辨率 dp px的关系
  15. 苹果商城怎么调成中文_海豚加速器拳头账号中文注册下载-海豚加速器拳头账号注册下载 v2020...
  16. 常用复原reast.css
  17. android入门之系统架构和环境搭建
  18. 源码角度分析Rebuild和Rebatch
  19. 1. Arthas的命令
  20. 阿里云服务器挖矿程序解决流程

热门文章

  1. 博士申请 | 哥本哈根大学招收机器学习和信息检索全奖博士生(年薪34万)
  2. 脑洞大开的机器视觉多领域学习模型结构 | CVPR 2018论文解读
  3. PaperWeekly社区 | 知识图谱 vs. 对话系统专题讨论
  4. 动态规划解题套路框架
  5. vc++ 6.0 创建程序快捷方式的一个例子源码_漏洞复现:phpcms v9.6.0任意文件上传漏洞(CVE201814399)...
  6. mfc 判断文件夹复制完成_Python办公自动化|自动整理文件,一键完成!
  7. Mybatis-typeAliases的作用
  8. 浙江省第二届大学生网络与信息安全竞赛在线预赛
  9. Machine Schedule
  10. Bear and Strings