Server for Information Technologies óÅÒ×ÅÒ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ
ãÅÎÔÒÏÍ éÎÆÏÒÍÁÃÉÏÎÎÙÈ ôÅÈÎÏÌÏÇÉÊ
(095) 932-9212, 932-9213, 939-0783
E-mail: info@citforum.ru
óÅÒ×ÅÒ ÓÏÄÅÒÖÉÔ ÍÏÒÅ(!) ÁÎÁÌÉÔÉÞÅÓËÏÊ ÉÎÆÏÒÍÁÃÉÉ CIT Forum CD-ROM

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×.
Comments: info@citmgu.ru
Designed by Andrey Novikov
Copyright © CIT