ÈÌß
locking - áëoêèpyeò èëè paçáëoêèpyeò y÷acòoê ôaéëa äëÿ
÷òeíèÿ èëè çaïècè
ÑÈÍÒÀÊÑÈÑ
#include <sys/types.h> #include <sys/locking.h> int locking (fildes, mode, size) int fildes, mode; long size;
ÎÏÈÑÀÍÈÅ
locking ïoçâoëÿeò ïpoöeccy yïpaâëÿòü çaäaííûìè áaéòaìè â
ôaéëe. Äpyãèe ïpoöeccû, æeëaþùèe ÷èòaòü èëè ïècaòü y÷acòoê
ôaéëa, coäepæaùèé áëoêèpoâaííûe áaéòû, áyäyò æäaòü äo òex
ïop, ïoêa y÷acòoê íe paçáëoêèpyeòcÿ â çaâècèìocòè oò peæèìa
ycòaíoâëeííoé áëoêèpoâêè.
×òoáû ìoæío áûëo ycòaíoâèòü áëoêèpoâêy oò ÷òeíèÿ, ôaéë äoëæeí áûòü oòêpûò äëÿ ÷òeíèÿ èëè ÷òeíèÿ/çaïècè. ×òoáû ìoæío áûëo ycòaíoâèòü áëoêèpoâêy oò çaïècè, ôaéë äoëæeí áûòü oòêpûò äëÿ çaïècè èëè ÷òeíèÿ/çaïècè. Ïpè íeâûïoëíeíèè ëþáoão èç ýòèx ycëoâèé áëoêèpoâêa íe còaâèòcÿ è ôoìèpyeòcÿ oøèáêa EINVAL.
Ïpoöecc, æeëaþùèé ÷èòaòü èëè ïècaòü y÷acòoê, paíee áëoêèpoâaííûé oò ÷òeíèÿ èëè çaïècè äpyãèì ïpoöeccoì (ècïoëüçyÿ peæèì LK_LOCK èëè LK_NBLCK), áyäeò æäaòü ocâoáoæäeíèÿ y÷acòêa áëoêèpoâaâøèì eão ïpoöeccoì.
Ïpoöecc, æeëaþùèé ïècaòü y÷acòoê ôaéëa, ÷òo áûë çaáëoêèpoâaí oò çaïècè äpyãèì ïpoöeccoì (ècïoëüçyÿ peæèì LK_RLCK èëè LK_NBRLCK), áyäeò æäaòü ocâoáoæäeíèÿ y÷acòêa áëoêèpoâaâøèì eão ïpoöeccoì, a ïpoöecc, æeëaþùèé ÷èòaòü ýòoò y÷acòoê, cìoæeò âûïoëíèòü ÷òeíèe.
Ïpoöecc, æeëaþùèé áëoêèpoâaòü y÷acòoê, coäepæèìoe êoòopoão yæe áëoêèpoâaío äpyãèì ïpoöeccoì, áyäeò æäaòü, ecëè peæèì áëoêèpoâêè LK_LOCK èëè LK_RLCK, è áyäeò âoçâpaùaòü yïpaâëeíèe c oøèáêoé EACCES, ecëè peæèì áëoêèpoâêè LK_NBLCK èëè LK_NBRLCK.
fildes ÿâëÿeòcÿ íoìepoì oòêpûòoão ôaéëa, âoçâpaùaeìûì âûçoâaìè creat, open, dup èëè pipe.
mode yêaçûâaeò peæèì áëoêèpoâêè y÷acòêa. Cèìâoëè÷ecêèe è ÷ècëoâûe çía÷eíèÿ ýòoão apãyìeíòa òaêoâû:
LK_UNLCK 0 | Paçáëoêèpyeò y÷acòoê. Teêyùèé ïpoöecc ocâoáoæäaeò y÷acòoê, êoòopûé oí paíee áëoêèpoâaë. |
---|---|
LK_LOCK 1 | Áëoêèpyeò y÷acòoê. Teêyùèé ïpoöecc áyäeò æäaòü ocâoáoæäeíèÿ y÷acòêa, ecëè êaêaÿ-ëèáo eão ÷acòü áëoêèpoâaía äpyãèì ïpoöeccoì. B êoíe÷íoì èòoãe y÷acòoê áëoêèpyeòcÿ òeêyùèì ïpoöeccoì è äpyãèe ïpoöeccû íe ìoãyò òeïepü ÷èòaòü èëè ïècaòü ýòoò y÷acòoê (áëoêèpoâêa oò ÷òeíèÿ è çaïècè). |
LK_NBLCK 2 | Áëoêèpyeò y÷acòoê. Ecëè êaêaÿ-ëèáo ÷acòü y÷acòêa áëoêèpoâaía äpyãèì ïpoöeccoì, âoçâpaùaeòcÿ oøèáêa EACCES áeç oæèäaíèÿ ocâoáoæäeíèÿ áëoêèpoâaííoão y÷acòêa (áëoêèpoâêa áeç oæèäaíèÿ). |
LK_RLCK 3 | Aíaëoãè÷ío LK_LOCK ça ècêëþ÷eíèeì òoão, ÷òo áëoêèpoâaííûé y÷acòoê ìoæeò ÷èòaòücÿ äpyãèìè ïpoöeccaìè (áëoêèpoâêa oò çaïècè). |
LK_NBRLCK 4 | Aíaëoãè÷ío LK_NBLCK ça ècêëþ÷eíèeì òoão, ÷òo áëoêèpoâaííûé y÷acòoê ìoæeò ÷èòaòücÿ äpyãèìè ïpoöeccaìè (áëoêèpoâêa oò çaïècè áeç oæèäaíèÿ). |
locking oòc÷èòûâaeò ía÷aëo áëoêèpyeìoão y÷acòêa oò òeêyùeé ïoçèöèè ôaéëa. Tèïè÷íaÿ ïocëeäoâaòeëüíocòü oïepaòopoâ, áëoêèpyþùaÿ òpeáyeìûé y÷acòoê â ôaéëe, ìoæeò áûòü cëeäyþùeé:
fd=open("datafile",O_RDWR); lseek(fd,200L,0); locking(fd,LK_LOCK,200L);
Äëÿ áëoêèpoâaíèÿ èëè paçáëoêèpoâaíèÿ öeëoão ôaéëa íyæío ycòaíoâèòü yêaçaòeëü ïoçèöèè ía ía÷aëo ôaéëa è çaòeì cäeëaòü âûçoâ locking c size, paâíûì 0.
size çaäaeò ÷ècëo ïocëeäoâaòeëüíûx áaéòoâ (äëèíy y÷acòêa), êoòopûe áëoêèpyþòcÿ èëè paçáëoêèpyþòcÿ. Ó÷acòoê, êoòopûé äoëæeí áûòü áëoêèpoâaí, ía÷èíaeòcÿ oò òeêyùeé ïoçèöèè â ôaéëe. Ecëè size paâío 0, áëoêèpyeòcÿ èëè paçáëoêèpyeòcÿ âecü ôaéë (ìaêcèìaëüío äo 2 â 30 còeïeíè áaéòoâ). size ìoæeò çaäaâaòü ïpaâyþ ãpaíèöy ça êoíöoì ôaéëa; â ýòoì cëy÷ae òoëüêo ïpoöecc, áëoêèpoâaâøèé ýòoò y÷acòoê, ìoæeò ïoëy÷aòü äocòyï ê áaéòaì âíyòpè ýòoão y÷acòêa.
Boçìoæíocòü âçaèìíoé áëoêèpoâêè (òyïèêa) âoçíèêaeò òoãäa, êoãäa ïpoöecc, èìeþùèé áëoêèpoâaííûé y÷acòoê, ïpèocòaíaâëèâaeòcÿ ïpè ïoïûòêe áëoêpoâaòü y÷acòoê, áëoêèpoâaííûé yæe äpyãèì ïpoöeccoì. Ïoýòoìy ôyíêöèè locking(3), read(3) è write(3) ïpoâepÿþò âoçìoæíocòü òyïèêa ïpeæäe, ÷eì ïepeâecòè ïpoöecc â oæèäaíèe. Ecëè oáíapyæeía âoçìoæíocòü òyïèêa, ôèêcèpyeòcÿ oøèáêa [EDEADLK] (èëè [EDEADLOCK]) è äeécòâèe íe âûïoëíÿeòcÿ.
Áëoêèpyeìûé y÷acòoê (âecü èëè eão ÷acòü) ìoæeò coäepæaòücÿ â paíee áëoêèpoâaííoì y÷acòêe. B ýòoì cëy÷ae, a òaêæe ecëè y÷acòêè cìeæíûe, y÷acòêè oáúeäèíÿþòcÿ â oäèí y÷acòoê ïpè ycëoâèè coãëacoâaíèÿ peæèìoâ áëoêèpoâêè. Ecëè peæèìû ïepeceêaþùèxcÿ y÷acòêoâ paçëè÷íû, oáúeäèíeíèe âoçìoæío ïpè yäoâëeòâopeíèè ïocëeäíeão yêaçaííoão peæèìa. Taêèì oápaçoì, ecëè y÷acòoê, áëoêèpyeìûé oò çaïècè, coâïaäaeò èëè ÿâëÿeòcÿ ÷acòüþ y÷acòêa, áëoêèpoâaííoão paíee òeì æe ïpoöeccoì oò ÷òeíèÿ è çaïècè, íoâûé y÷acòoê áyäeò áëoêèpoâaí òoëüêo oò ÷òeíèÿ, a ocòaâøaÿcÿ ÷acòü ïpeæíeão y÷acòêa, ecëè oía ecòü, áyäeò ïpoäoëæaòü áûòü áëoêèpoâaííoé oò ÷òeíèÿ è çaïècè. Ha ÷ècëo áëoêèpyeìûx â ôaéëe y÷acòêoâ oãpaíè÷eíèÿ íeò, ío ecòü oãpaíè÷eíèe ía oáùee ÷ècëo áëoêèpoâaííûx y÷acòêoâ â cècòeìe. Äëÿ XENIX ýòo oãpaíè÷eíèe paâío 200.
Çaïpoc ía paçáëoêèpoâaíèe ìoæeò paçáëoêèpoâaòü ïoëíocòüþ èëè ÷acòè÷ío íecêoëüêo y÷acòêoâ, áëoêèpoâaííûx äaííûì ïpoöeccoì. Ecëè y÷acòêè paçáëoêèpyþòcÿ íe ïoëíocòüþ, ocòaâøèecÿ y÷acòêè ocòaþòcÿ áëoêèpoâaííûìè òeì æe ïpoöeccoì. Paçáëoêèpoâaíèe cepeäèíû y÷acòêa ïpèâoäèò ê ïoÿâëeíèþ äâyx áëoêèpoâaííûx y÷acòêoâ, ò.e. ê äoáaâëeíèþ oäíoão ýëeìeíòa ê òaáëèöe áëoêèpoâaííûx y÷acòêoâ. Ecëè òaáëèöa yæe ïoëía, ôèêcèpyeòcÿ oøèáêa è äeécòâèe íe âûïoëíÿeòcÿ. Paçáëoêèpoâaòü y÷acòoê ìoæeò òoëüêo òoò ïpoöecc, êoòopûé eão áëoêèpoâaë. Paçáëoêèpoâaíèe y÷acòêa, êoòopûé èëè íe áûë áëoêèpoâaí, èëè yæe paçáëoêèpoâaí, íe äeëaeò íè÷eão. Ïpè çaâepøeíèè ïpoöecca âce áëoêèpoâaííûe èì y÷acòêè paçáëoêèpyþòcÿ.
Ecëè ïpoöecc oòêpûë ôaéë áoëee oäíoão paça, âce cäeëaííûe ýòèì ïpoöeccoì â ýòoì ôaéëe áëoêèpoâêè yíè÷òoæaþòcÿ ïpè ïepâoì çaêpûòèè ôaéëa.
Ïpèìeíeíèe áëoêèpoâêè ê cïeöèaëüíoìy ôaéëy èëè ïpoãpaììíoìy êaíaëy íe âoçâpaùaeò oøèáêè, ío ïpè oïepaöèÿx ÷òeíèÿ/çaïècè c ýòèì ôaéëoì áëoêèpoâêa èãíopèpyeòcÿ. Heëüçÿ ïpèìeíÿòü áëoêèpoâêy ê êaòaëoãy.
ÑÌ. ÒÀÊÆÅ
creat(3), open(3), read(3), write(3), dup(3), close(3),
lseek(3)
ÄÈÀÃÍÎÑÒÈÊÀ
B cëy÷ae oøèáêè locking âoçâpaùaeò (int)-1. Ecëè ïpè
áëoêèpoâêe c peæèìoì LK_LOCK èëè LK_RLCK y÷acòoê oêaçûâaeòcÿ
yæe áëoêèpoâaííûì, XENIX System V çaíocèò â errno EAGAIN.
XENIX 3.0 â ýòoì cëy÷ae çaíocèò â errno EACCES. Ecëè
áëoêèpoâêa ïpèìeíÿeòcÿ ê êaòaëoãy, â errno çaíocèòcÿ EACCES.
Ecëè âoçìoæeí òyïèê, â errno çaíocèòcÿ EDEADLK (èëè
EDEADLOCK). Taêoé æe êoä oøèáêè çaíocèòcÿ ïpè ïepeïoëíeíèè
cècòeìíoé òaáëèöû áëoêèpoâaííûx y÷acòêoâ.