あと filelock がいろいろ間違っているな。以下、書き直しの例。

sub filelock{
  my $lockfile = $fn_boarddir . $Qs_get{'board'} . '/bbslockdir';
  if(stat($lockfile)[9] < time - 30){
    unfilelock();
  }
  for ($lockcnt=0; $lockcnt < 10; $lockcnt++){
    if(mkdir($lockfile, 777)){
      return 0;
    }
    sleep(1);
  }
  PrintErrorAndExit("ファイルロックを解除できません");
}

これできちんと sleep(1) しながら 10 回ファイルロックを試すようになる。
元のコードだと、「グローバル変数$i」の中身によって、
「sleepなしで11回試して、成功・失敗に関わらずreturn 0」か、
「1回試してロックに失敗したら即エラー終了」のどちらかがランダムに選ばれたはずだ。

また、もともとのコードでは
for ($lockcnt=0; $lockcnt <= 10; $lockcnt++)
となっていたが、この書き方だとロックを都合11回試すことになる。

こういう場合の for だと普通は < しか使わない。
気持ち悪いので上の例では直しておいた。