来讲讲:30分钟无操纵主动关机的Linux小程序
安装和登录命令:login、shutdown、halt、reboot、mount、umount、chsh如今就来理论一下,写一个主动关机的小程序。该程序能够保卫历程的体例运转,当用户在必定工夫(好比30分钟)没有鼠标和键盘操纵后就会主动关机。
这个程序使用了上篇文章中完成的daemonize函数,为程序创立了保卫历程所必要的运转情况。
因为必要同时监听鼠标和键盘操纵,以是必要接纳多线程的体例来完成。个中两个线程分离监督鼠标和键盘,一旦检测到响应举措(鼠标点击和挪动、击键等),全局工夫戳stamp(time_t)就会被设成以后工夫。主线程每隔必定工夫(好比1秒)反省stamp,若以后工夫值(time(NULL))比stamp年夜30*60,则实行停机操纵(利用system函数实行init0命令,大概利用reboot函数)。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<fcntl.h>//~O_RDWR,S_IRWXUetc.
#include<pthread.h>
#include<time.h>
#include<limits.h>
#include<signal.h>
voiddaemonize();
//~threadfunctions
void*listen_ms(void*);
void*listen_kb(void*);
//~timestamp,keepingthetime
//~whenthelastKBorMouseeventhappened.
volatiletime_tstamp;
//~mutexkeepingstampconsistent.
pthread_mutex_tstamp_mutex;
int
main()
{
daemonize();
//~initializethemutex,stamp
pthread_mutex_init(&stamp_mutex,NULL);
//time(&stamp);
stamp=time(NULL);
//~createtwothreadsmonitoringtheMouseandKeyboard.
pthread_tms_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);
}
unsignedintinterval=60*30;
while(1)
{
sleep(1);
pthread_mutex_lock(&stamp_mutex);
if(time(NULL)-stamp>interval)
{
/*printf("shutdown
");*/
/*fflush(stdin);*/
system("init0");
}
pthread_mutex_unlock(&stamp_mutex);
}
//~jointhethreads,thoughitllneverbeexcuted.
pthread_join(ms_tid,NULL);
pthread_join(kb_tid,NULL);
return0;
}
void*
listen_ms(void*arg)
{
intfd=open("/dev/input/mice",O_RDONLY);
if(fd<0)
{
perror("openmice");
exit(1);
}
charbuf;
while(read(fd,buf,sizeof(buf))>0)
{
/*printf("MousedMoved.
");*/
pthread_mutex_lock(&stamp_mutex);
//time(&stamp);
stamp=time(NULL);
pthread_mutex_unlock(&stamp_mutex);
}
close(fd);
}
void*
listen_kb(void*arg)
{
intfd=open("/dev/input/event3",O_RDONLY);
if(fd<0)
{
perror("openevent3");
exit(1);
}
charbuf;
</p>12下一页
讨论什么版本好并无意义,关键是你是不是真心想学.不过,为了避免曲高和寡,最好选用的人多的版本。
来讲讲:30分钟无操纵主动关机的Linux小程序
由于在linux中,用户权限很大,做任何事情都很自由,所以,你往往需要知道你做的每一步在干什么。while(read(fd,buf,sizeof(buf))>0)
{
/*printf("KeyHit.\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);
intfd=open("/dev/null",O_RDWR);
//intfd=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之类的文件。
不敷的地方在于,没法对全屏形式举行判别,便是说,假如你全屏看一部较长的影戏,大概会被关机……
</p>上一页12
对于开发环境的选择尽量要轻量级和高度可定制,航空母舰级别的工具往往会让你迷惑不解; 一些显而易见的小错误还是用vi改正比较方便。以后的大一点的程序就得在Linux下调试了,因为有的头文件在VC里面说找不到。? 就这样,我们一边上OS理论课,一边上这个实验,这样挺互补的,老师讲课,一步一步地布置任务 我是学习嵌入式方向的,这学期就选修了这门专业任选课。 Linux只是个内核!这点很重要,你必须理解这一点。只有一个内核是不能构成一个操作系统的。 众所周知,目前windows操作系统是主流,在以后相当长的时间内不会有太大的改变,其方便友好的图形界面吸引了众多的用户。 这也正是有别的OS得以存在的原因,每个系统都有其自身的优点。? linux鸟哥的私房菜,第三版,基础篇,网上有pdf下的,看它的目录和每章的介绍就行了,这个绝对原创!
页:
[1]