这是一个自动关机的小程序。该程序可以守护进程的方式运行,当用户在一定时间(比如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/
分享到:
相关推荐
根据给定文件的信息,本文将围绕“纯C语言实现自动关机”的主题展开,详细介绍如何使用C语言调用系统命令来实现计算机的自动关机功能,并解析相关代码及其实现原理。 ### C语言实现自动关机的核心概念 在Windows...
在Android系统中,实现自动开关机功能涉及到对操作系统底层机制的理解以及权限的控制。这个"Android 自动开关机实现 源码"很可能是提供了一种解决方案,让我们深入探讨一下这个话题。 首先,我们要知道在Android...
在本文中,我们将探讨如何使用代码实现自动关机功能,特别是在Android平台上。这个过程涉及到多个步骤,包括工程文件的创建、编译、安装以及解决可能出现的问题。首先,我们需要在Windows环境下编写工程文件,通常是...
在电脑使用过程中,有时我们可能需要让电脑在特定时间自动关机,以便节省电力或进行夜间维护。"设定电脑自动关机程序"这个主题就是关于如何实现这一功能的知识点。通常,这涉及到编写脚本或者利用系统内置的功能来...
在Android系统中,实现自动开关机涉及到多个层次的技术,包括系统服务、权限管理以及与硬件交互等。以下是对"源码-Android自动开关机实现"这个主题的详细讲解。 首先,我们要明白Android是一个基于Linux内核的操作...
在Android系统中,实现自动开关机涉及到多个层次的技术,包括系统权限、服务、定时任务以及对Android内核的深入理解。下面将详细讲解这个主题。 首先,我们要知道Android是一个基于Linux内核的操作系统,它的自动开...
本项目“java实现的多功能自动关机小程序”就是一个利用Java编程语言来创建的实用工具,它具备了三种主要功能:倒计时自动关机、按系统时间自动关机以及每次使用电脑时定时关机。 首先,我们来详细探讨倒计时自动...
Java自动关机源码涉及到的是Java编程语言在操作系统层面的操作,主要是通过调用系统命令来实现计算机的定时关机功能。这个源码可能是为了解决某些自动化任务完成后需要自动关闭计算机的需求,比如长时间运行的批处理...
本篇文章将详细讲解如何利用Linux的crontab来实现定时自动关机。 首先,我们来看一下`crontab`这个命令。`crontab`是Linux下的一个任务调度命令,它允许用户设定自己的定时任务。`crontab -e`用于编辑当前用户的...
为解决这一问题,我们可以借助第三方程序,例如本文将介绍的基于JAVA编写的定时自动关机与取消自动关机的小程序。这款程序不仅能够实现定时关机,还贴心地提供了取消关机的功能,以防止误操作。 JAVA作为一种广泛...
- 在Linux或Unix系统中,可以使用`shutdown`或`halt`命令,例如`shutdown -h +30`表示30分钟后关机。 2. **编程语言实现自动关机**: - 使用Python,可以调用os模块的system函数执行上述命令,例如`os.system('...
自动关机功能在Windows、Mac OS和Linux等主流操作系统中都有相应的实现方式。在Windows中,可以使用“计划任务”或者第三方软件如“关机助手”来设置;在Mac OS中,可以利用“Automator”配合“苹果脚本”实现;而在...
总之,自动关机功能通过操作系统级别的控制实现,无论是通过命令行还是借助第三方工具,都能根据用户的需要设置电脑在特定时间自动关闭,有效节省电力,保护硬件,同时也方便了用户规划工作和休息时间。
在IT领域,自动关机代码通常涉及到编程语言的系统控制功能,用于实现计算机在特定条件或时间自动关闭。这个主题看似简单,但其实包含了多个关键知识点,包括编程基础、操作系统接口调用以及时间管理和事件触发。 ...
定时自动关机软件通常设计为跨平台,支持Windows、Mac OS、Linux等操作系统,确保在不同环境下都能使用。 5. **安全性**: 使用此类软件时,应确保它们来自可信赖的源,以免安装包含恶意软件的程序,威胁到系统的...
首先,断网自动关机的实现通常依赖于编程语言和操作系统。在Windows系统中,可以使用批处理文件(.bat)结合ping命令来检测网络状态。例如,一个简单的脚本可能包括持续ping一个公共IP(如8.8.8.8,Google的DNS...
总的来说,代码自动关机是通过编程语言与操作系统接口交互来实现的,它允许用户在特定时间或满足特定条件时自动关闭计算机。无论是在Windows还是Linux环境下,都有相应的命令或API可供调用。对于开发者而言,掌握...
在Linux系统中,批量远程关机脚本是一个重要的管理工具,尤其在管理多台服务器时,能够有效地提高工作效率。这个“linux关机脚本.zip”压缩包可能包含了一个或者多个用于实现这一功能的脚本文件。下面将详细介绍如何...
在Linux系统管理中,自动化任务执行是一个非常实用的功能,尤其对于服务器维护来说,定时自动关机可以帮助节省电力、优化资源分配。本篇内容主要讲解如何使用`crontab`配合Linux关机命令来实现定时自动关机。 `...
在这个场景中,我们关注的是如何利用Linux命令来实现系统的快速关机和重启,这对于熟悉命令行操作的用户来说非常实用,特别是对于拥有Android设备ROOT权限的用户。在Android系统中,通过命令行工具可以执行更底层的...