LOCKING(3)
XENIX System V (21 èþíÿ 1987)

ÈÌß
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â.