cgi.rbを使わずにやってみました。
http://apollorec.main.jp/ruby/
ソースコード全部は、上に置いてます。

class Kent
  #-------------------------------------------------
  #  フォームデコード
  #-------------------------------------------------
  def initialize
    buf = ""
    @form = Hash.new
    if ENV['REQUEST_METHOD'] == "POST"
      if ENV['CONTENT_LENGTH'].to_i < 51200
        buf = $stdin.read(ENV['CONTENT_LENGTH'].to_i)
      end
    else
      buf = ENV['QUERY_STRING']
    end
    buf.split(/&/).each {|l|
      (key,val) = l.split(/=/)
      val = "" unless val
      key = key.tr('+', ' ').gsub(/((?:%[0-9a-fA-F]{2})+)/n) do
        [$1.delete('%')].pack('H*')
      end
      val = val.tr('+', ' ').gsub(/((?:%[0-9a-fA-F]{2})+)/n) do
        [$1.delete('%')].pack('H*')
      end
      val.gsub!('&', '&amp;')
      val.gsub!('"', '&quot;')
      val.gsub!('>', '&gt;')
      val.gsub!('<', '&lt;')
      val.gsub!("\r\n",'<br>')
      val.gsub!("\r",'<br>')
      val.gsub!("\n",'<br>')
      if @form[key]
        @form[key] = @form[key] + "\0" + val
      else
        @form[key] = val
      end
    }
  end
  def [](key)
    @form[key].to_s
  end
  #-------------------------------------------------
  #  クッキー発行
  #-------------------------------------------------
  def set_cookie(str, name = 'KENT')
    t = Time.now + 60*24*60*60
    gmt = t.strftime("%a, %d-%b-%Y %H:%M:%S GMT")
    str = str.gsub(/([^ a-zA-Z0-9_.-]+)/n) do
      '%' + $1.unpack('H2' * $1.size).join('%').upcase
    end.tr(' ', '+')
    print "Set-Cookie: #{name}=#{str}; expires=#{gmt}\n";
  end
  #-------------------------------------------------
  #  クッキー取得
  #-------------------------------------------------
  def get_cookie(name = 'KENT')
    str = ENV['HTTP_COOKIE'] || ''
    cook = Hash.new("")
    str.split(/;/).each {|l|
      (key,val) = l.split(/=/)
      key.gsub!(/\s/,'')
      cook[key] = val
    }
    cook[name].tr('+', ' ').gsub(/((?:%[0-9a-fA-F]{2})+)/n) do
      [$1.delete('%')].pack('H*')
    end
  end
  #-------------------------------------------------
  #  ファイルロック
  #-------------------------------------------------
  def lock(lock_dir)
    lock_flag = false
    3.times{
      begin
        Dir.mkdir(lock_dir)
        lock_flag = true
        break
      rescue
        d = File::stat(lock_dir)
        Dir.rmdir(lock_dir) if d.mtime.to_i < Time.now.to_i - 60
        sleep 1
      end
    }
    return lock_flag
  end
  #-------------------------------------------------
  #  アンロック
  #-------------------------------------------------
  def unlock(lock_dir)
    begin
      Dir.rmdir(lock_dir)
      lock_flg = true
    rescue
      lock_flag = false
    end
    return lock_flag
  end
end

cgi.rb使った方がいいんですか。
htmlエスケープも一度にできるし、クッキーも使いやすいので、
これはこれで自分が使う範囲では使いやすいので、
これはこれという事で。。。

ロックも複数ファイルを更新する時とかいるかなと思うんですけど

そして、kentやるならYYbbsをと思ってソース見たら、
更に、ややこしやー、でした。
昔はもっとシンプルだったと思うんだけどなー。