仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 717|回复: 8
打印 上一主题 下一主题

[其他Linux] 来讲讲:30分钟无操纵主动关机的Linux小程序

[复制链接]
因胸联盟 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 11:59:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
安装和登录命令: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[256];
  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[256];
</p>
12下一页


讨论什么版本好并无意义,关键是你是不是真心想学.不过,为了避免曲高和寡,最好选用的人多的版本。
因胸联盟 该用户已被删除
沙发
 楼主| 发表于 2015-1-16 12:27:40 | 只看该作者

来讲讲: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


对于开发环境的选择尽量要轻量级和高度可定制,航空母舰级别的工具往往会让你迷惑不解;
不帅 该用户已被删除
板凳
发表于 2015-1-27 09:42:59 | 只看该作者
一些显而易见的小错误还是用vi改正比较方便。以后的大一点的程序就得在Linux下调试了,因为有的头文件在VC里面说找不到。?
只想知道 该用户已被删除
地板
发表于 2015-2-5 12:35:56 | 只看该作者
就这样,我们一边上OS理论课,一边上这个实验,这样挺互补的,老师讲课,一步一步地布置任务
5#
发表于 2015-2-11 21:52:57 | 只看该作者
我是学习嵌入式方向的,这学期就选修了这门专业任选课。
乐观 该用户已被删除
6#
发表于 2015-3-2 21:08:51 | 只看该作者
Linux只是个内核!这点很重要,你必须理解这一点。只有一个内核是不能构成一个操作系统的。
愤怒的大鸟 该用户已被删除
7#
发表于 2015-3-11 07:43:51 | 只看该作者
众所周知,目前windows操作系统是主流,在以后相当长的时间内不会有太大的改变,其方便友好的图形界面吸引了众多的用户。
蒙在股里 该用户已被删除
8#
发表于 2015-3-18 04:27:39 | 只看该作者
这也正是有别的OS得以存在的原因,每个系统都有其自身的优点。?
变相怪杰 该用户已被删除
9#
发表于 2015-3-25 17:01:23 | 只看该作者
linux鸟哥的私房菜,第三版,基础篇,网上有pdf下的,看它的目录和每章的介绍就行了,这个绝对原创!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 16:47

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表