IT猫扑网:您身边最放心的安全下载站! 最新更新| 软件分类| 专题汇总| 手机版

您当前所在位置:IT猫扑网 > 操作系统 > LINUX > Linux中实现30分钟无操作自动关机

Linux中实现30分钟无操作自动关机

时间:2015-06-28 00:00 来源:IT猫扑网|http://www.itmop.com/ 作者:网管联盟 我要评论(0)

  现在就来实践一下,写一个自动关机的小程序。该程序可以守护进程的方式运行,当用户在一定时间(比如30分钟)没有鼠标和键盘操作后就会自动关机。

  这个程序利用了上篇文章中实现的daemonize函数,为程序创建了守护进程所需要的运行环境。

  由于需要同时监听鼠标和键盘操作,所以需要采用多线程的方式来实现。其中两个线程分别监视鼠标和键盘,一旦检测到相应动作(鼠标点击和移动、击键等),全局时间戳stamp(time_t)就会被设成当前时间。主线程每隔一定时间(比如1秒)检查stamp,若当前时间值(time(NULL))比stamp大30*60,则执行停机操作(使用system函数执行init 0命令,或者使用reboot函数)。

  #include <stdio.h>

  #include <stdlib.h>

  #include <unistd.h>

  #include <sys/types.h>

  #include <fcntl.h> //~ O_RDWR, S_IRWXU etc.

  #include <pthread.h>

  #include <time.h>

  #include <limits.h>

  #include <signal.h>

  void daemonize();

  //~ thread functions

  void *listen_ms(void *);

  void *listen_kb(void *);

  //~ time stamp, keeping the time

  //~ when the last KB or Mouse event happened.

  volatile time_t stamp;

  //~ mutex keeping stamp consistent.

  pthread_mutex_t stamp_mutex;

  int

  main()

  {

  daemonize();

  //~ initialize the mutex, stamp

  pthread_mutex_init(&stamp_mutex, NULL);

  //time(&stamp);

  stamp = time(NULL);

  //~ create two threads monitoring the Mouse and Keyboard.

  pthread_t ms_tid, kb_tid;

  if(pthread_create(&ms_tid, NULL, listen_ms, NULL) != 0)

  {

  perror(&pthread_create&);

  exit(1);

  }

  if(pthread_create(&kb_tid, NULL, listen_kb, NULL) != 0)

  {

  perror(&pthread_create&);

  exit(1);

  }

  unsigned int interval = 60 * 30;

  while(1)

  {

  sleep(1);

  pthread_mutex_lock(&stamp_mutex);

  if( time(NULL) - stamp > interval )

  {

  /*printf(&shutdownn&);*/

  /*fflush(stdin);*/

  system(&init 0&);

  }

  pthread_mutex_unlock(&stamp_mutex);

  }

  //~ join the threads, though it'll never be excuted.

  pthread_join(ms_tid, NULL);

  pthread_join(kb_tid, NULL);

  return 0;

  }

  void *

  listen_ms(void * arg)

  {

  int fd = open(&/dev/input/mice&, O_RDONLY);

  if(fd < 0)

  {

  perror(&open mice&);

  exit(1);

  }

  char buf[256];

  while( read(fd, buf, sizeof(buf)) > 0 )

  {

  /*printf(&Moused Moved.n&);*/

  pthread_mutex_lock(&stamp_mutex);

  //time(&stamp);

  stamp = time(NULL);

  pthread_mutex_unlock(&stamp_mutex);

  }

  close(fd);

  }

  void *

  listen_kb(void * arg)

  {

  int fd = open(&/dev/input/event3&, O_RDONLY);

  if(fd < 0)

  {

  perror(&open event3&);

  exit(1);

  }

  char buf[256];

  while( read(fd, buf, sizeof(buf)) > 0 )

  {

  /*printf(&Key Hit.n&);*/

  pthread_mutex_lock(&stamp_mutex);

  //time(&stamp);

  stamp = time(NULL);

  pthread_mutex_unlock(&stamp_mutex);

  }

  close(fd);

  }

  void

  daemonize()

  {

  if( fork() > 0)

  exit(0);

  setsid();

  close(0);

  close(1);

  close(2);

  int fd = open(&/dev/null&, O_RDWR);

  //int fd = open(&log.txt&, O_RDWR);

  dup2(fd, 1);

  dup2(fd, 2);

  chdir(&/&);

  umask(0);

  signal(SIGCHLD, SIG_IGN);

  }

  需要说明的是,共享变量stamp需要互斥地访问。另外,对鼠标事件的监听是借助于对设备文件/dev/input/mice的读取(阻塞方式),键盘的监听借助于对/dev/input/event3的非阻塞读取,但我猜想在不同机器上可能会是其它诸如event0,event5之类的文件。

  不足之处在于,无法对全屏模式进行判断,即是说,如果你全屏看一部较长的电影,可能会被关机……

关键词标签:Linux

相关阅读 安装红帽子RedHat Linux9.0操作系统教程 Tomcat9.0如何安装_Tomcat9.0环境变量配置方法 多种操作系统NTP客户端配置 Linux操作系统修改IP Linux实现SCSI硬盘热插拔及在线识别 Linux下用CDMA modem拨号上网

文章评论
发表评论

热门文章 安装红帽子RedHat Linux9.0操作系统教程 安装红帽子RedHat Linux9.0操作系统教程 Linux服务器:设计高性能网站架构-LLMP Linux服务器:设计高性能网站架构-LLMP 使用Clonezilla迁移到虚拟Linux环境 使用Clonezilla迁移到虚拟Linux环境 Linux上的MRTG流量监控中心 Linux上的MRTG流量监控中心 Linux 双网卡绑定一个IP原理及实现 Linux 双网卡绑定一个IP原理及实现 linux和windows等系统远程控制ubuntu桌面 linux和windows等系统远程控制ubuntu桌面

相关下载

人气排行 Linux下获取CPUID、硬盘序列号与MAC地址 dmidecode命令查看内存型号 linux tc实现ip流量限制 安装红帽子RedHat Linux9.0操作系统教程 linux下解压rar文件 lcx.exe、nc.exe、sc.exe入侵中的使用方法 Ubuntu linux 关机、重启、注销 命令 查看linux服务器硬盘IO读写负载 linux命令行浏览器的使用方法 Linux NFS服务固定端口及防火墙配置 U盘安装Ubuntu 10.04 Linux清除用户登录记录和命令历史方法