--- flock(operation)

    եåޤå 0 ֤ޤ
    㳰 Errno::EXXX ȯޤLOCK_NB 
    ꤵƤơ֥å줽ʾˤ false ֤ޤ
    ͭ operation ϰʲ̤Ǥ

    * LOCK_SH

      ͭåʣΥץƱ˥åͭǤޤ

      ƥˤäƤϥåоݤΥեɤ߹ߥ⡼
      ("r", "r+" ʤ)ǥץ󤵤ƤɬפޤΤ
      ʥƥǤɤ߹߲ǽǤʤեФå㳰 
      Errno::EBADF [Errno::EXXX] ȯ뤫⤷ޤ

    * LOCK_EX

      ¾åƱˤϤҤȤĤΥץåݻǤޤ

      ƥˤäƤϥåоݤΥեϽ񤭹ߥ⡼
      ("w", "r+" ʤ)ǥץ󤵤ƤɬפޤΤ
      ʥƥǤϽ񤭹߲ǽǤʤեФå㳰 
      Errno::EBADF [Errno::EXXX] ȯ뤫⤷ޤ

    * LOCK_UN

      å

      ŪʥåʳˡRuby󥿥ץ꥿νλ
      (ץνλ)ˤäƤ⼫ưŪ˥å֤ϲޤ

    * LOCK_NB

      Υ֥å⡼ɡ

      LOCK_SH | LOCK_NB Τ褦¾λ or 뤳Ȥǻ
      ꤷޤλ꤬ʤ硢֥åǤ flock 
      θƤӽФϥåޤǥ֥åޤ

      LOCK_NB λ꤬硢֥åǤ
      flock  false ֤ޤ

      ֥֥åפȤ
      * ¾Υץ¾å򤹤Ǥ˹ԤäƤ˥åԤ
      * ¾ΥץåƤ֤¾åԤ
      ξǤ

    ʾ File::Constants ⥸塼Ƥޤ

    :

        f = File.open("/tmp/foo", "w")

        f.flock(File::LOCK_EX)
        puts "locked by process1"

        fork {
          f = File.open("/tmp/foo", "r")
          f.flock(File::LOCK_SH)
          puts "locked by process2"
          sleep 5
          puts "unlocked by process2"
        }

        sleep 5

        f.flock(File::LOCK_UN)
        puts "unlocked by process1"
        sleep 1 # <- ҥץμ¤˥å뤿 sleep
        f.flock(File::LOCK_EX)
        puts "re-locked by process1"

        => locked by process1
           unlocked by process1
           locked by process2
           unlocked by process2
           re-locked by process1

