`
jakielong
  • 浏览: 223314 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

这是一个自动关机的小程序。该程序可以守护进程的方式运行,当用户在一定时间(比如30分钟)没有鼠标和键盘操作后就会自动关机。。
  由于需要同时监听鼠标和键盘操作,所以需要采用多线程的方式来实现。其中两个线程分别监视鼠标和键盘,一旦检测到相应动作(鼠标点击和移动、击键等),全局时间戳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("shutdown\n");*/
            /*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之类的文件。

  不足之处在于,无法对全屏模式进行判断,即是说,如果你全屏看一部较长的电影,可能会被关机……
  如果你有好的方法来实现本文的功能,还请不吝赐教!

转自:http://www.dutor.net/index.php/2010/09/linux-auto-halt/

分享到:
评论

相关推荐

    windows界面下批量操作,监控管理上万台Linux Unix 服务器

    进行分实验室,分组管理,Unix linux服务器远程批量操作模式,批量操作模式 可以多线程操控Unix,Linux,服务器执行命令,获 取状态,输出命令执行结果,可以实现大批量修改文 件,关机,解放双手,实现管理自动化。...

    LInux Unix Windows 实验室服务器批量管理操作监控软件

    进行分实验室,分组管理,Unix linux服务器远程批量操作模式,批量操作模式 可以多线程操控Unix,Linux,服务器执行命令,获 取状态,输出命令执行结果,可以实现大批量修改文 件,关机,解放双手,实现管理自动化。...

    史上图形最简单Linux-Unix批量管理服务器软件工具

    进行分实验室,分组管理,Unix linux服务器远程批量操作模式,批量操作模式 可以多线程操控Unix,Linux,服务器执行命令,获 取状态,输出命令执行结果,可以实现大批量修改文 件,关机,解放双手,实现管理自动化。...

    Window 下批量管理批量操作万台Linux Solaris Aix HP-Unix Windows 服务器图形管理软件

    进行分实验室,分组管理,Unix linux服务器远程批量操作模式,批量操作模式 可以多线程操控Unix,Linux,服务器执行命令,获 取状态,输出命令执行结果,可以实现大批量修改文 件,关机,解放双手,实现管理自动化。...

    史上图形最简单Linux-Unix-Windows批量管理服务器软件工具

    进行分实验室,分组管理,Unix linux服务器远程批量操作模式,批量操作模式 可以多线程操控Unix,Linux,服务器执行命令,获 取状态,输出命令执行结果,可以实现大批量修改文 件,关机,解放双手,实现管理自动化。...

    史上图形最简单最好用Linux-Unix-Windows批量管理服务器软件工具

    进行分实验室,分组管理,Unix linux服务器远程批量操作模式,批量操作模式 可以多线程操控Unix,Linux,服务器执行命令,获 取状态,输出命令执行结果,可以实现大批量修改文 件,关机,解放双手,实现管理自动化。...

    LINUX网站建设技术指南

    本书介绍如何在Linux下建立,运行并维护站点的综合技术,它适合于有一定的Linux或Linux基本操作基础的网络建立者。 本书从建站的准备工作开始,写到建立功能强大的INTERNET网站,层层深入,涉及到网站建设中所遇到的...

    Linux (Ubuntu)休眠,挂起,待机,关机的命令详细介绍

    这里对linux 的几个命令整理下,有:休眠,挂起,待机,关机等几个命令的区别及如何实现。 休眠是一种更加省电的模式,它将内存中的数据保存于硬盘中,所有设备都停止工作。当再次使用时需按开关机键,机器将会恢复...

    cmd操作命令和linux命令大全收集

    3. Nslookup-------IP地址侦测器 ,是一个 监测网络中 DNS 服务器是否能正确实现域名解析的命令行工具。它在 Windows NT/2000/XP 中均可使用,但在 Windows 98 中却没有集成这一个工具。 4. explorer-------打开...

    Linux管理员指南

    目 录 前言 第一部分 安装Linux操作系统 作为服务器软件 第1章 Linux发行版本与Windows NT的 技术异同 1 1.1 Linux操作系统和Linux发行版本 1 1.2 “自由”软件和GNU许可证 1 1.2.1 什么是...

    iWebData批量管理服务器软件工具

    进行分实验室,分组管理,Unix linux服务器远程批量操作模式,批量操作模式 可以多线程操控Unix,Linux,服务器执行命令,获 取状态,输出命令执行结果,可以实现大批量修改文 件,关机,解放双手,实现管理自动化。...

    LINUX 24学时教程

    3.5 在OpenLinux操作系统中使用艾美加 (Iomega)公司的Zip驱动器 42 3.6 课时小结 43 3.7 专家答疑 43 3.8 练习题 43 第二部分 学习Linux操作系统的基本命令 第4学时 阅读与浏览命令 46 4.1 使用man命令获取帮助 46...

    入门学习Linux常用必会60个命令实例详解doc/txt

    因为Linux与Windows不同,其后台运行着许多进程,所以强制关机可能会导致进程的数据丢失,使系统处于不稳定的状态,甚至在有的系统中会损坏硬件设备(硬盘)。在系统关机前使用 shutdown命令,系统管理员会通知所有...

    详解如何在 Linux 启动时自动执行命令或脚本

    本文,我们将探讨一下在 Linux 操作系统中实现这些目标的传统方法。 注意:我们假定使用的是 Bash 作为登录及注销的主 Shell。如果你使用的是其他 Shell,那么有些方法可能会无效。如果有其他的疑问,请参考对应的 ...

    PrimoCache Server2.2.0服务器版.exe

    PrimoCache 是一款可以将物理内存、SSD 硬盘或闪存盘等虚拟成硬盘缓存的软件(虚拟内存盘软件),它可以自动将硬盘中读取的数据存入物理内存等速度较快的设备,当系统再次需要该数据时它可以很快从缓存设备中读取,而...

    vc++ 应用源码包_6

    实现了屏幕绘图操作,实现电子标尺数据计算以及显示,有数据库操作保存数据。 VC++ ini文件读写操作类实例 VC++版源代码统计工具 内含自绘CMenu、CButton、CDialog、CStatic、CListCtrl等。 VC++6.0 控制摄像头 ...

    vc++ 应用源码包_1

    实现了屏幕绘图操作,实现电子标尺数据计算以及显示,有数据库操作保存数据。 VC++ ini文件读写操作类实例 VC++版源代码统计工具 内含自绘CMenu、CButton、CDialog、CStatic、CListCtrl等。 VC++6.0 控制摄像头 ...

    vc++ 应用源码包_5

    实现了屏幕绘图操作,实现电子标尺数据计算以及显示,有数据库操作保存数据。 VC++ ini文件读写操作类实例 VC++版源代码统计工具 内含自绘CMenu、CButton、CDialog、CStatic、CListCtrl等。 VC++6.0 控制摄像头 ...

    vc++ 应用源码包_2

    实现了屏幕绘图操作,实现电子标尺数据计算以及显示,有数据库操作保存数据。 VC++ ini文件读写操作类实例 VC++版源代码统计工具 内含自绘CMenu、CButton、CDialog、CStatic、CListCtrl等。 VC++6.0 控制摄像头 ...

Global site tag (gtag.js) - Google Analytics