本例子是自建聊天室中的一个程序,用于将已经空置多时的聊天室关闭和进行相应的善后处理。
#!/usr/bin/perl$flag_file="/home/www/mrtg/logs/room.flag";
#系统中记录聊天室配置的文件;$flag_tmp="/home/www/mrtg/logs/flag.tmp";$filelog="wjz.txt";
#用于在处理过程的临时文件;
open(FLAG, "$#@60;$flag_file")||die "Cant open $flag_file file. $!";
&lock_file(FLAG);open(FTMP, "$#@62;$flag_tmp")||die "Cant open $flag_tmp file. $!";
&lock_file(FTMP);
#将要处理的文件分别打开;
while ($hang=$#@60;FLAG$#@62;) #循环读入FLAG文件的每一行;
{
$yeah=0;
($port,$flag,$room,$passwd,$type) = split(/@@@@@@@/, $hang); #行分解;
if($flag eq "0") #判断标志位;
{
$pid_f="/home/www/mrtg/logs/chatpid.".$port;
open(PIFD,"$#@60;$pid_f")||die "cant open!";
$ppid=$#@60;PIFD$#@62;;
close($pid_f);
#读进程文件里的进程号;
$len=length($ppid);
system"ps -ax|grep $ppid|grep chats $#@62;$#@62;$filelog";
open(LOG,"$#@60;$filelog")||die "cant open the file!";
while($line=$#@60;LOG$#@62;)
{
@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) { s em("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("Cant 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);}#两个子函数,用于在打开处理文件中,锁住或开启文件;