|
éíñ
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×.
|