自建聊天室的善后处理例子

本例子是自建聊天室中的一个程序,用于将已经空置多时的聊天室关闭
和进行相应的善后处理。

#!/usr/bin/perl
$flag_file="/home/www/mrtg/logs/room.flag";
    #系统中记录聊天室配置的文件;
$flag_tmp="/home/www/mrtg/logs/flag.tmp";
$filelog="wjz.txt";
    #用于在处理过程的临时文件;

open(FLAG, "<$flag_file")||die "Can't open $flag_file file. $!";
  &lock_file(FLAG);
open(FTMP, ">$flag_tmp")||die "Can't open $flag_tmp file. $!";
  &lock_file(FTMP);
  #将要处理的文件分别打开;

while ($hang=<FLAG>) #循环读入FLAG文件的每一行;
  {
    $yeah=0;
    ($port,$flag,$room,$passwd,$type) = split(/@@@@@@@/, $hang);  #行分解;
    if($flag eq "0") #判断标志位;
   {
          $pid_f="/home/www/mrtg/logs/chatpid.".$port;
          open(PIFD,"<$pid_f")||die "can't open!";
          $ppid=<PIFD>;
          close($pid_f);
           #读进程文件里的进程号;
          $len=length($ppid);
          system"ps -ax|grep $ppid|grep chats >>$filelog"; 
          open(LOG,"<$filelog")||die "can't open the file!";
            while($line=<LOG>)
               {
                   @list=split(/\s+/,$line);
                   $line=join("",@list);
                   $go=substr($line,0,$len);
# print "$go--$ppid\n";
                   if ($go==$ppid) {  $yeah=1; }
                }
          close LOG;

#利用unix系统命令调用,得到过期进程所产生的相应文件组,并写到临时文件中;
          system("rm $filelog");
# print "$yeah-first\n";
          if ($yeah==0)
               {
                   $user_f="/home/www/mrtg/logs/chatuser.".$po
                   $file_f="/home/www/mrtg/logs/chatfile.".$po
                   $conf_f="/home/www/mrtg/logs/chatconf.".$po
                   $pid_f="/home/www/mrtg/logs/chatpid.".$port
                   if(-e $user_f) { system("rm $user_f"); }
                   if(-e $file_f) { system("rm $file_f"); }
                   if(-e $conf_f) { system("rm $conf_f"); }
                   if(-e $pid_f)  { system("rm $pid_f");  }
#清理掉所有的废旧文件;
                   $flag=1;
                   $room="antoni";
                   $passwd="wjz123";
                   $type="闲谈类";
                   @array=($port,$flag,$room,$passwd,$type);
                   $wjz=join("@@@@@@@",@array);
                   $hang=$wjz."\n";
               }
        }
#以上几句重新修改聊天室配置文件;
# print "$hang\n";
   print FTMP $hang;
   }
  close FLAG;
  close FTMP;
  &unlock_file(FTMP);
  rename("$flag_tmp", "$flag_file")||die("Can't rename $flag_tmp file $!");
    &unlock_file (FLAG);
if(-e $flag_tmp) { system("rm $flag_tmp"); }
  #完成从临时文件到配置文件的转换;
sub lock_file {
  local($FILE_HANDLE) = @_;
  local($try) = 0;
  local($status) = 0;

  while ($status != 0) {
  $status = flock($FILE_HANDLE, 2);
  ($try == 4) && last;
  $status && sleep(1);
  $try++;
  }
}
sub unlock_file {
  local($FILE_HANDLE) = @_;
  flock($FILE_HANDLE, 8);
}
#两个子函数,用于在打开处理文件中,锁住或开启文件;