自建聊天室的善后处理例子 |
|
本例子是自建聊天室中的一个程序,用于将已经空置多时的聊天室关闭
和进行相应的善后处理。 #!/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); } #两个子函数,用于在打开处理文件中,锁住或开启文件; |