      Linux ڥ졼ƥ󥰥ƥ Mandatory File Locking

                Andy Walker <andy@lysaker.kvaerner.no>

                         1996 ǯ 4  15 

======================================================================
                ܸܹ <hng@ps.ksky.ne.jp>
                    ѱѤ <hotta@net-newbie.com>

1. å (mandatory lock) Ȥϡ
-------------------------------------

åϡץ֤ǰեΥ󥷥륢
ڤ뤿ˡŪ˻Ȥ붨Ĵ (cooperative) եå
Фͥ뤬Ū˥եåΤǤեå
flock()  fcntl() ƥॳ ( fcntl() ΥåѡǤ
lockf() 饤֥롼) ѤƤޤե
å򤫤ˡåå뤳ȤϰŪ˥ץԤ
åե򹹿ƥե򥢥å֤ᤷޤ
̤ѤƤ뤳ϥ桼 mailbox ˥뤳Ȥ
 (sendmail ξϺǤݤǤ)Mail User Agent  Mail Transfer
Agent  mailbox Ʊ˹ƤϤʤ餺mailcox Ƥ
Ϥɤ߽ФȤɻߤʤФʤޤ

ǤϡץĴʤ侩 (advisory) å
Ѥ餹Ǥ礦ʤ顢ϴǤϤʤȤƤ
˽񤫤줿ɤвäƤޤ

˼ȤǡSystem V UNIX ߷׼Ԥϡֶץå
ͤФޤˤꡢڥ졼ƥ󥰥ƥΥͥϡ
ץ "read" ⤷ "shared" åݻƤեء
Υץ񤳤ȤΤ˻ߤޤޤץ "write"
⤷ "exclusive" åݻƤեؤɽФȽߤ
ξ˻ߤޤ

System V ζåϡ¸Υ桼ɤˤǤƶ
Ϳʤ褦ޤ϶åθȤƸġΥե
ޡå򤫤ˤ̾ο侩åƱ͡¸
fcntl()/lockf() 󥿡եѤޤ

 1 - 嵭Ρ֥եפȤɽϡ򤤤Ƥޤ
System V Υå fcntl() ˴Ťޤfcntl() γ٤ϥե
Υå˲äեΥХϰϤΥåΤǡå
Υ롼Хȥ٥ˤʤޤ

 2 - POSIX.1  System V  fcntl() åΥƤ
ˤؤ餺åΤɤʥƤޤ󡣶
Υ System V Interface Definition (SVID) Version 3 
Ƥޤ

2. åѤ˥եޡ
---------------------------------

եåθȤƥޡˤϡΥեΥ⡼ɤ
롼 id ӥåȤ򥻥åȤ롼׼¹ԥӥåȤ򥯥ꥢޤ
礻ʳ̵̣ǡȹ礻ϴ¸Υ桼ץʤ褦
System V μԤ򤷤ޤ

setgid Ƥե˽ߤԤ줿硢̾ϥͥ
ưŪ˥롼 id ӥåȤ򥯥ꥢޤϥƥкǤ
ͥ϶å̤ʾǧΥӥåȤ򥯥ꥢʤ
褦˽ޤƱͤ˥ͥ setgid øäå
¹Ԥʤ褦˽ޤ

3. Ѳǽʼ
-----------------

SunOS 4.1.x, Solaris 2.x, HP-UX 9.x ѲǽʶåμƤ
ޤ

黰ĤΥե󥹥ƥब񤤤Ū˸뤳ȤƳ
Ȥޤ㳰¿ޤ

ɤΥե󥹥ƥ⡢̤Υץå򤫤Ƥե
Ф open() ݤ褦ˤʤäƤޤ SVID 3 
ľܰȿΤǤSVID 3 ϡ O_TRUNC ե饰åȤ줿 open()
ؤΥΤߵݤ٤ȤƤޤLinux μϡSVID 
˽򤷤ƤơO_TRUNC ѤΤߥեƤǤ
ʡ׿񤤤򤷤ޤ

HP-UX ϡåǤϤʤ侩å줿ե O_TRUNC
Ѥ open() ǤĤޤ󡣤 POSIX.1 ˰ȿ褦˻
ޤ

mmap() ޤ̣ΰĤǤΥڥ졼ƥ󥰥ƥ
Ϥɤ mmap() 줿եФƶå򤫤뤳Ȥɻߤ
HP-UX ˤĤƤϡΤ褦ʥեФ侩åĤ
ƤޤSVID ǤϡHP-UX ˴ؤ뤳Τ褦мŪʿ񤤤ˤĤ
⵬ꤷƤޤ

θǤϡMAP_SHARED ޥåԥ󥰤åդ٤ǤϤʤ
ƶå - μϤɤʤäƤΤ

SunOS ˾Ūǡ϶åΤ O_NONBLOCK ե饰ν
餵ʤΤǡå줿եؤɤ߽񤭤ϤĤ˻ߤ졢
EAGAIN ֤ϤǤ

ϥޥƥΤ褦ʤȤǰǤǽҤ٤륻ޥ
ƥפ褦ʤ¾ΤǤͭǤ

4. ޥƥ
-----------------

1. å fcntl()/lockf() å󥰥󥿡ե - 
    System V/POSIX 󥿡ե - 𤷤ƤΤߤޤ
   flock() Ѥ BSD ΥåϡåˤϤʤޤ

2. ץɽФζåǥեΰ˥åƤ硢
   ¾ΥץϤΰ褫ɽФޤΥץ
   줫ΰ˽⤦ȤȡåޤԤ
   (block) ޤâץ O_NONBLOCK Ѥƥե򥪡
   ץ󤷤Ƥ硢ƥॳϥ顼ơ EAGAIN ȼä
   ֤ޤ

3. ץߤζåǥեΰåƤ硢
   ΰФɽФ⤷Ͻߤ褦Ȥȡå
   ޤԤ (block) ޤâץ O_NONBLOCK Ѥƥե
   򥪡ץ󤷤Ƥ硢ƥॳϥ顼ơ EAGAIN
   ȼäƤ֤ޤ

4. ¾ΥץåƤ¸եؤ O_TRUNC Ѥ
   open() ⤷ creat() ϥ顼ơ EAGAIN ȼäƵ
   ݤޤ

5. (MAP_SHARED Ѥ mmap() ) ޥåפ춦ͭ줿ե
   ˶å򤫤褦Ȥȡ顼ơ EAGAIN ȼ
   Ƶݤޤ

6. åθ̤ġ(MAP_SHARED Ѥ mmap() ) ͭ
   줿ޥåץե褦Ȥȡ顼ơ
   EAGAIN ȼäƵݤޤ

5. ɤΥƥॳ뤬ƶޤ
---------------------------------------

ñ inode ǤϤʤեƤΤǤ
read(), write(), readv(), writev(), open(), creat(), mmap(),
truncate(), ftruncate() Ǥtruncate()  ftruncate() ϶
δǤϡֽߡưȹͤޤ

̡ƶΰϸߤΰ֤ɽФ⤷ϽߤХȿ
˵ڤ֤ΤȤơꤵޤtruncate Ǥϡ⤷ɲ
ХȿȤƻꤵޤ (˥åñˡ֥եΡפ
ǤΤǡХȤϰϻǤϤʤХȤɲäȹͤʤФ
ޤ)

 3 - Υɤ뤿Ǯ˺Ȥޤå
å뤳Ȥɬפʥƥॳ򤤤ĤȤ⤷ޤ
󡣵դϻΤ餻뤫äȤΤϥƥॳ򤢤ʤ
ѥå䤫 Linus ФȤǤ

6. ٹ
---------

root Ǥå̵ˤϤǤʤΤǡ̿Ūʥեå
ޤ¤äƤޤäץȡƥब纮˴٤äƤޤ
⤷ޤ󡣤ɤˤϡեɤ߽񤭤ˡΥե
Υѡߥåѹ (setgid ӥåȤ򥯥ꥢ) 褦ˤޤ
󤳤ǥƥबϥ󥰤褦ȡäȾٹɬפ⤷
ޤ :-(
