蒙在股里 发表于 2015-1-16 11:23:49

带来一篇Perl历程间通信研讨

在linux中学习命令的最好办法是学习Shell脚本编程,Shell脚本比起其他语言来学习简单,但是功能却十分强大.通过学习Shell编程,能让你掌握大量的linux命令。
Perl历程间通信头几天做了一个对照复杂的器材,但感到对照意义就在这里记上去。也许的需求是如许的:有一个程序在会发生一些告诫信息并保留在/var/log/alert中的。假如有新的告诫信息时就要在服务器上收回告诫的声响,但启动是经由过程web界面的而不是在命令行。
  刚入手下手想到步骤是如许的:
  1、由于是要在背景运转,一定是fork一个子历程,父历程加入而不会使web程序堵塞在此,
  2、然后再fork一个子历程,父历程卖力监听日记文件的更新。子历程卖力挪用声响程序。二者之者用管道通信。
  3、要及时监控日记文件的更新,由于不想弄太庞大就用管道的体例:open(LOG,"tail-n2-f/var/log/alert|")||die"Unabletoopenlogfile$!
";如许就能够复杂的失掉文件的及时更新
  4、要思索到加入,以是必要一个文件保留历程ID。
  如许完成的代码很复杂:
  my$pidfile="/tmp/alertsounds.pid";
  subStartAlertSounds{
  my$pid;
  if($pid=fork()){
  return;
  }elsif(defined$pid){
  system("echopid=$>$pidfile");#保留历程ID
  &RunAlertSounds();
  }
  }else{
  die"Cantfork:$!
";
  }
  }
  subRunAlertSounds{
  my$pid;
  pipe(README,WRITEME);
  if($pid=fork()){#父历程
  close(README);
  open(LOG,"tail-n2-f/var/log/alert|")||die"Unabletoopenlogfile$!
";
  while(<LOG>){
  printWRITEME"Sounds
";
  }
  close(LOG);
  close(WRITEME);
  }elsif(defined$pid){#子历程
  close(WRITEME);
  while(<README>){
  system("/usr/bin/sounds/AlertSounds>/dev/null2>&1");
  }
  close(README);
  }else{
  die"Cantfork:$!
";
  }
  }
  但测试一下就发明了很多成绩:
  1、加入时open(LOG,"tail-n2-f/var/log/snort/alert|")所发生的子历程不会一同加入。
  2、当短工夫内(好比1秒)有多条信息过去时,我们但愿只发生一条告诫声响,但如今会一连响多条。
  3、偶然父历程往管道写数据时子历程纷歧定能即刻收到;
  剖析一下就有上面的办理办法:
  1、使父历程成为历程组的首级头目历程,然后在父历程加入前给历程组发送加入旌旗灯号。
  2、利用锁机制,父历程写数据前锁定。等子历程挪用声响程序完成后再解锁。在解锁前假如父历程有监听到新的告诫就疏忽。复杂的一点的锁机制就用一个文件:父历程创立一个空文件暗示已上锁,子历程删除这个文件暗示解锁
  3、这个是由于缓存成绩,把管道的缓存设置好就好了。
  修正后的代码以下:
  my$pidfile="/tmp/alertsounds.pid";
  my$lockfilename="/tmp/sounds.lock";
  subStartAlertSounds{
  my$pid;
  if($pid=fork()){
  return;
  }elsif(defined$pid){
  setpgrp(0,0);#以后历程成为历程组的首级头目
  $SIG{INT}=&catch_zap;#INT旌旗灯号处置
  $SIG{QUIT}=&catch_zap;#QUIT旌旗灯号处置
  system("echo$>$pidfile");#保留历程ID
  &RunAlertSounds();
  }
  }else{
  die"Cantfork:$!
";
  }
  }
  subRunAlertSounds{
  my$pid;
  system("rm-f$lockfilename");
  pipe(README,WRITEME);
  if($pid=fork()){#父历程
  close(README);#封闭读端
  select(WRITEME);#这里必定要选择,否则设置的缓存巨细不会对WRITEME无效
  $|=1;
  open(LOG,"tail-n2-f/var/log/alert|")||die"Unabletoopenlogfile$!
";
  while(<LOG>){
  system(“touch$lockfilename");#加锁
  printWRITEME"Sounds

12下一页


学习linux,就意味着更快的开发效率,等更多关于软件本身或者说操作系统本身的理解。

蒙在股里 发表于 2015-1-16 12:36:27

带来一篇Perl历程间通信研讨

要明白学好linux不是一件一蹴而就的事,一定要能坚持使用它,特别是在使用初期。
";</P>  }
  close(LOG);
  close(WRITEME);
  waitpid($pid,0);
  }elsif(defined$pid){#子历程
  close(WRITEME);#封闭写端
  while(<README>){
  system(“/usr/bin/sounds/AlertSounds>/dev/null2>&1");
  sleep(1);
  system("rm-f$lockfilename");#解锁
  }
  close(README);
  }else{
  die"Cantfork:$!\n";
  }
  }
  subcatch_zap{
  local$SIG{QUIT}=IGNORE;#扫除本人
  kill(QUIT,-$);#关照历程组的一切历程加入
  system("echo>$pidfile");
  exit;
  }
  subStoptAlertSounds{
  if(-e$pidfile){
  @pid=`cat$pidfile`;
  kill(QUIT,$pid})if(defined$pidand$pidne);
  }
  }
</p>上一页12


买一本命令参考手册是必要的,遇到不知道怎么用的命令可以随时查询,这要比查man文档快.特别适合英语不好。

老尸 发表于 2015-1-18 15:51:26

通过一条缓慢的调制解调器线路,它也能操纵几千公里以外的远程系统。

飘灵儿 发表于 2015-1-27 10:15:18

上课传授的不仅仅是知识,更重要的是一些道理,包括一些做人的道理,讲课时也抓住重点,循序渐进,让同学理解很快;更可贵的是不以你过去的成绩看问题.

海妖 发表于 2015-2-5 10:33:49

随着Linux应用的扩展,出现了不少Linux社区。有一些非常优秀的社区往往是Linux高手的舞台,如果在探讨高级技巧的论坛张贴非常初级的问题经常会没有结果。

第二个灵魂 发表于 2015-2-11 11:26:41

任何人都可以根据自己的喜好来定制适合自己的操作系统,Linux?是抢占式多任务多用户操作系统.

简单生活 发表于 2015-3-2 12:37:04

如果你想深入学习Linux,看不懂因为文档实在是太难了。写的最好的、最全面的文档都是英语写的,最先发布的技术信息也都是用英语写的。

灵魂腐蚀 发表于 2015-3-11 04:09:13

众所周知,目前windows操作系统是主流,在以后相当长的时间内不会有太大的改变,其方便友好的图形界面吸引了众多的用户。

乐观 发表于 2015-3-17 20:53:34

Linux高手更具有鼓励新手的文化精神。如何在Linux社区获得帮助,需要说明的是你要有周全的思考,准备好你的问题,不要草率的发问。

兰色精灵 发表于 2015-3-25 02:36:13

Windows有MS-DOS?方式,在该方式下通过输入DOS命令来操作电脑;Linux与Windows类似,也有命令方式,Linux?启动后如果不执行?X-WINDOWS,就会处于命令方式下,必须发命令才能操作电脑。?
页: [1]
查看完整版本: 带来一篇Perl历程间通信研讨