ΠΠΌΠ΅ΡΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π°ΡΠΏΠ΅ΠΊΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²:
ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π·Π°ΠΏΠΈΡΠ΅ΠΉ
ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π·Π°ΠΏΠΈΡΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΎΠΉ ΡΠ°ΡΡΠΈ ΡΠ°ΠΉΠ»Π°. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ°ΠΉΠ»Ρ Unix ΡΠ²Π»ΡΡΡΡΡ ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ Π±Π°ΠΉΡΠΎΠ², Π±ΡΠ»ΠΎ Π±Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ΅ΡΠΌΠΈΠ½ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° (range lock), ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Π±Π°ΠΉΡΠΎΠ². Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΡΠ΅ΡΠΌΠΈΠ½ Β«Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π·Π°ΠΏΠΈΡΠ΅ΠΉΒ» ΠΎΠ±ΡΠ΅ΡΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ.
ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π²ΡΠ΅Π³ΠΎ ΡΠ°ΠΉΠ»Π°
ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π²ΡΠ΅Π³ΠΎ ΡΠ°ΠΉΠ»Π°, ΠΊΠ°ΠΊ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅, Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ Π²Π΅ΡΡ ΡΠ°ΠΉΠ», Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ Π΅Π³ΠΎ ΡΠ°Π·ΠΌΠ΅Ρ ΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π² Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ. ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ BSD ΠΏΡΠ΅Π΄ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π»ΠΈΡΡ Π²ΡΠ΅Π³ΠΎ ΡΠ°ΠΉΠ»Π°. ΠΠ»Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π²ΡΠ΅Π³ΠΎ ΡΠ°ΠΉΠ»Π° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° POSIX ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π½ΡΠ»Π΅Π²ΡΡ Π΄Π»ΠΈΠ½Ρ. ΠΡΠΎ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΡΠ΅ΡΡΡ ΠΎΡΠΎΠ±ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΊΠ°ΠΊ Β«Π²Π΅ΡΡ ΡΠ°ΠΉΠ»Β».
ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΡΡΠ΅Π½ΠΈΡ
ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Π΅Ρ Π·Π°ΠΏΠΈΡΡ Π² ΡΠΈΡΠ°Π΅ΠΌΡΡ ΠΎΠ±Π»Π°ΡΡΡ. Π ΡΠ°ΠΉΠ»Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΡΡΠ°ΡΡΠΊΠΎΠ², Π΄Π°ΠΆΠ΅ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ ΡΠ°ΠΉΠ»Π°, Π½Π΅ ΠΌΠ΅ΡΠ°ΡΡΠΈΡ Π΄ΡΡΠ³ Π΄ΡΡΠ³Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊ Π΄Π°Π½Π½ΡΠΌ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΈ ΠΎΠ½ΠΈ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΡΡ.
ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π·Π°ΠΏΠΈΡΠΈ
ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π·Π°ΠΏΠΈΡΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΡΠΉ Π΄ΠΎΡΡΡΠΏ ΠΊ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ. ΠΡΠ»ΠΈ ΡΡΠ° ΠΎΠ±Π»Π°ΡΡΡ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π° ΡΠ°ΠΊΠΆΠ΅ ΠΈ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ, ΠΏΠΎΠΏΡΡΠΊΠ° ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π·Π°ΠΏΠΈΡΠΈ Π»ΠΈΠ±ΠΎ Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ, Π»ΠΈΠ±ΠΎ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ Π½Π΅ΡΠ΄Π°ΡΠ΅ΠΉ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π·Π°ΠΏΡΠΎΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ. ΠΠΎΡΠ»Π΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π·Π°ΠΏΠΈΡΠΈ ΠΏΠΎΠΏΡΡΠΊΠ° ΠΏΠΎΠ»ΡΡΠΈΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΡΡΠ΅Π½ΠΈΡ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ Π½Π΅ΡΠ΄Π°ΡΠ΅ΠΉ.
ΠΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ°
ΠΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° (advisory lock) ΡΠ΅ΡΠ½ΠΎ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ Π·Π°ΠΌΠΊΡ Π½Π° Π΄Π²Π΅ΡΠΈ. ΠΠΎΠ²ΠΎΡΡΡ, Β«Π·Π°ΠΌΠΊΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ Π΄Π»Ρ ΡΠ΅ΡΡΠ½ΡΡ Π»ΡΠ΄Π΅ΠΉΒ», ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π΅ΡΠ»ΠΈ ΠΊΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π·Π°Ρ ΠΎΡΠ΅Ρ Π²Π»ΠΎΠΌΠΈΡΡΡΡ Π² Π²Π°Ρ Π΄ΠΎΠΌ, ΠΎΠ½, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π°ΠΉΠ΄Π΅Ρ ΡΠΏΠΎΡΠΎΠ± ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ, Π½Π΅ΡΠΌΠΎΡΡΡ Π½Π° Π½Π°Π»ΠΈΡΠΈΠ΅ Π·Π°ΠΌΠΊΠ° Π² Π΄Π²Π΅ΡΠΈ. Π’ΠΎ ΠΆΠ΅ ΠΈ ΡΠΎ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΎΠΉ; ΠΎΠ½Π° ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π»ΠΈΡΡ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΡΠΎΡ, ΠΊΡΠΎ ΠΏΡΡΠ°Π΅ΡΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌΡ ΡΠ°ΠΉΠ»Ρ, ΡΠ½Π°ΡΠ°Π»Π° ΠΏΡΡΠ°Π΅ΡΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ. ΠΠ΄Π½Π°ΠΊΠΎ, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ ΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΈ Π΄Π΅Π»Π°ΡΡ Ρ ΡΠ°ΠΉΠ»ΠΎΠΌ, ΡΡΠΎ Π·Π°Ρ ΠΎΡΠ΅Ρ (ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΠΏΠΎΠΊΠ° ΡΡΠΎ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅ΡΡΡ ΠΏΡΠ°Π²Π°ΠΌΠΈ Π΄ΠΎΠΏΡΡΠΊΠ° ΡΠ°ΠΉΠ»Π°).
ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ°
ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΡΠ²Π»ΡΠ΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΡΡΠΎΠ³ΠΎΠΉ: ΠΊΠΎΠ³Π΄Π° ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π° ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ°, Π½ΠΈ ΠΎΠ΄ΠΈΠ½ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌΡ ΡΠ°ΠΉΠ»Ρ. ΠΡΠ±ΠΎΠΉ ΠΏΡΠΎΡΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΡΠ°Π΅ΡΡΡ ΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠΎ, Π»ΠΈΠ±ΠΎ ΡΠ°ΠΌ Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ Π΄ΠΎ ΡΠ½ΡΡΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΠ°ΠΉΠ»Π°, Π»ΠΈΠ±ΠΎ Π΅Π³ΠΎ ΠΏΠΎΠΏΡΡΠΊΠ° Π·Π°Π²Π΅ΡΡΠΈΡΡΡ Π½Π΅ΡΠ΄Π°ΡΠ΅ΠΉ. (ΠΠΎΠ΄ GNU/Linux ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅ ΡΡΠΎ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ root!)
ΠΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½Π° Π΄Π»Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΡΡΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, ΡΠ°Π·Π΄Π΅Π»ΡΡΡΠΈΡ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡΠ°Π»ΡΠ½ΡΠΉ ΡΠ°ΠΉΠ», ΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° Π½ΠΈ ΠΎΠ΄Π½ΠΈΠΌ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π² ΡΠΈΡΡΠ°ΡΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠ° Π² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ°ΠΉΠ»Π° ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΌ, ΠΊΠ°ΠΊ Π² ΠΊΠΎΠΌΠΌΠ΅ΡΡΠ΅ΡΠΊΠΈΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ Π±Π°Π· Π΄Π°Π½Π½ΡΡ .
POSIX ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·ΡΠ΅Ρ Π»ΠΈΡΡ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ. ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π΄ΠΎΡΡΡΠΏΠ½Π° Π½Π° GNU/Linux, Π° ΡΠ°ΠΊΠΆΠ΅ Π² ΡΡΠ΄Π΅ ΠΊΠΎΠΌΠΌΠ΅ΡΡΠ΅ΡΠΊΠΈΡ ΡΠΈΡΡΠ΅ΠΌ Unix, Π½ΠΎ Π΄Π΅ΡΠ°Π»ΠΈ Π²Π°ΡΡΠΈΡΡΡΡ. ΠΠ°Π»Π΅Π΅ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π΄Π΅ΡΠ°Π»ΠΈ Π΄Π»Ρ GNU/Linux.
14.2.2. ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° POSIX: fcntl() ΠΈ lockf()
Π‘ΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² fcntl() (file control β ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠΌ) ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΠ°ΠΉΠ»Π°. (ΠΡΡΠ³ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ fcntl() Π±ΡΠ»ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 9.4.3 Β«Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π°ΡΡΠΈΠ±ΡΡΠ°ΠΌΠΈ ΡΠ°ΠΉΠ»Π°: fcntl()Β».) ΠΠ½ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
#include <unistd.h> /* POSIX */
#include <fcntl.h>
int fcntl(int fd, int cmd); /* Not relevant for file locking */
int fcntl(int fd, int cmd, long arg); /* Not relevant for file locking */
int fcntl(int fd, int cmd, struct flock *lock);
ΠΡΠ³ΡΠΌΠ΅Π½ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅:
fd ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠ°ΠΉΠ»Π° Π΄Π»Ρ ΠΎΡΠΊΡΡΡΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°.
cmd ΠΠ΄Π½Π° ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½Ρ, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ Π² <fcntl.h>. ΠΠΈΠΆΠ΅ ΠΎΠ½ΠΈ ΠΎΠΏΠΈΡΠ°Π½Ρ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ.
lock Π£ΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° struct flock, ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Π½ΡΠΆΠ½ΡΠΉ Π±Π»ΠΎΠΊ.
14.2.2.1. ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ
ΠΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅ΡΡ ΠΎΡΡΡΠ΅ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΈΡΡΠ»Π΅Π΄ΡΠ΅ΠΌ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅. ΠΡΠΎ Π΄Π΅Π»Π°Π΅ΡΡΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΡΡΡΠΊΡΡΡΡ struct flock, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΡΡ Π±Π°ΠΉΡΠΎΠ² ΠΈ Π²ΠΈΠ΄ Π½ΡΠΆΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ. Π‘ΡΠ°Π½Π΄Π°ΡΡ POSIX ΡΡΠ²Π΅ΡΠΆΠ΄Π°Π΅Ρ, ΡΡΠΎ struct lock ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Β«ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅Β» ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ ΡΠ»Π΅Π½Ρ. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ ΠΏΡΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠ»Π΅Π½Ρ ΡΡΡΡΠΊΡΡΡΡ. ΠΠ· ΡΠ»Π΅Π³ΠΊΠ° ΠΎΡΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΡ fcntl(3):
struct flock {
...
short l_type; /* Π’ΠΈΠΏ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ: F_RDLCK, F_WRLCK, F_UNLCK */
short l_whence; /* ΠΠ°ΠΊ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΡΠ΅ΡΡΡ l_start:
SEEK_SET, SEEK_CUR, SEEK_END */
off_t l_start; /* ΠΠ°ΡΠ°Π»ΡΠ½ΠΎΠ΅ Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΠΎΠ΅ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ */
off_t l_len; /* Π§ΠΈΡΠ»ΠΎ Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΡΡ Π±Π°ΠΉΡΠΎΠ²;
0 ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΠΎΡ Π½Π°ΡΠ°Π»Π° Π΄ΠΎ ΠΊΠΎΠ½ΡΠ° ΡΠ°ΠΉΠ»Π° */
pid_t l_pid; /* PID Π±Π»ΠΎΠΊΠΈΡΡΡΡΠ΅Π³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° (ΡΠΎΠ»ΡΠΊΠΎ F_GETLK) */
...
};
ΠΠΎΠ»Π΅ l_start ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π±Π°ΠΉΡΠ° Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΡΠ°ΡΡΠΊΠ°. l_len ΡΠ²Π»ΡΠ΅ΡΡΡ Π΄Π»ΠΈΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΡΠ°ΡΡΠΊΠ°, Ρ. Π΅. ΠΎΠ±ΡΠΈΠΌ ΡΠΈΡΠ»ΠΎΠΌ Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΡΡ Π±Π°ΠΉΡΠΎΠ². l_whence ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΌΠ΅ΡΡΠΎ Π² ΡΠ°ΠΉΠ»Π΅, ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΎΡΡΡΠΈΡΡΠ²Π°Π΅ΡΡΡ l_start, Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠ΅ ΠΆΠ΅, ΡΡΠΎ ΠΈ Π΄Π»Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° whence ΡΡΠ½ΠΊΡΠΈΠΈ lseek() (ΡΠΌ ΡΠ°Π·Π΄Π΅Π» 4.5 Β«ΠΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΉ Π΄ΠΎΡΡΡΠΏ: ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π²Π½ΡΡΡΠΈ ΡΠ°ΠΉΠ»Π°Β»), ΠΎΡΡΡΠ΄Π° ΠΈ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»Ρ. ΠΡΠ° ΡΡΡΡΠΊΡΡΡΠ° ΡΠ°ΠΌΠΎΠ΄ΠΎΡΡΠ°ΡΠΎΡΠ½Π°: ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ l_start ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ l_whence Π½Π΅ ΡΠ²ΡΠ·Π°Π½Ρ Ρ ΡΠ΅ΠΊΡΡΠΈΠΌ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΌ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΌ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΠΈ. ΠΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠ΄Π° ΠΌΠΎΠ³ Π±Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
struct employee { /* ΡΡΠΎ ΡΠ³ΠΎΠ΄Π½ΠΎ */ }; /* ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΠΎΡΡΡΠ΄Π½ΠΈΠΊΠ° */
struct flock lock; /* Π‘ΡΡΡΠΊΡΡΡΠ° Π±Π»ΠΎΠΊΠ° */
...
/* ΠΠ°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΡΡΡΡΠΊΡΡΡΡ Π΄Π»Ρ ΡΠ΅ΡΡΠΎΠ³ΠΎ ΡΠΎΡΡΡΠ΄Π½ΠΈΠΊΠ° */
lock.l_whence = SEEK_SET; /* ΠΠ±ΡΠΎΠ»ΡΡΠ½ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ */
lock.l_start = 5 * sizeof(struct employee); /* ΠΠ°ΡΠ°Π»ΠΎ 6-ΠΉ ΡΡΡΡΠΊΡΡΡΡ */
lock.l_len = sizeof(struct employee); /* ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ΄Π½Ρ Π·Π°ΠΏΠΈΡΡ */
ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ SEEK_CUR ΠΈΠ»ΠΈ SEEK_END, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠ°ΡΡΠΊΠΈ, Π½Π°ΡΠΈΠ½Π°Ρ ΠΎΡ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π² ΡΠ°ΠΉΠ»Π΅ ΠΈΠ»ΠΈ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΊΠΎΠ½ΡΠ° ΡΠ°ΠΉΠ»Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ. ΠΠ»Ρ ΡΡΠΈΡ Π΄Π²ΡΡ ΡΠ»ΡΡΠ°Π΅Π² l_start ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΌ, ΠΏΠΎΠΊΠ° Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎΠ΅ Π½Π°ΡΠ°Π»ΠΎ Π½Π΅ ΠΌΠ΅Π½ΡΡΠ΅ Π½ΡΠ»Ρ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΠΎΠ±Ρ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ Π·Π°ΠΏΠΈΡΡ Π² ΡΠ°ΠΉΠ»Π΅:
/* ΠΠ°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ Π·Π°ΠΏΠΈΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ ΡΠΎΡΡΡΠ΄Π½ΠΈΠΊΠ° */
lock.l_whence = SEEK_END; /* ΠΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ EOF */
lock.l_start = -1 * sizeof (struct employee);
/* ΠΠ°ΡΠ°Π»ΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ ΡΡΡΡΠΊΡΡΡΡ */
lock.l_len = sizeof(struct employee); /* ΠΠ°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ΄Π½Ρ Π·Π°ΠΏΠΈΡΡ */
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° l_len Π² 0 ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΡΠΎΠ±ΡΠΌ ΡΠ»ΡΡΠ°Π΅ΠΌ. ΠΠ½ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΡΠ°ΠΉΠ»Π° ΠΎΡ Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ l_start ΠΈ l_whence, ΠΈ Π΄ΠΎ ΠΊΠΎΠ½ΡΠ° ΡΠ°ΠΉΠ»Π°. Π‘ΡΠ΄Π° Π²Ρ ΠΎΠ΄ΡΡ ΡΠ°ΠΊΠΆΠ΅ Π»ΡΠ±ΡΠ΅ ΠΎΠ±Π»Π°ΡΡΠΈ Π·Π° ΠΊΠΎΠ½ΡΠΎΠΌ ΡΠ°ΠΉΠ»Π°. (ΠΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, Π΅ΡΠ»ΠΈ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ°ΠΉΠ» ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΡΡΡ Π² ΡΠ°Π·ΠΌΠ΅ΡΠ΅, ΠΎΠ±Π»Π°ΡΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΠ°ΡΡΠΈΡΡΠ΅ΡΡΡ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ ΠΎΡ Π²Π°ΡΡΠ²Π°ΡΡ Π²Π΅ΡΡ ΡΠ°ΠΉΠ».) Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΡΠ΅Π³ΠΎ ΡΠ°ΠΉΠ»Π° ΡΠ²Π»ΡΠ΅ΡΡΡ Π²ΡΡΠΎΠΆΠ΄Π΅Π½Π½ΡΠΌ ΡΠ»ΡΡΠ°Π΅ΠΌ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΎΠ΄Π½ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ:
lock.l_whence = SEEK_SET; /* ΠΠ±ΡΠΎΠ»ΡΡΠ½ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ */
lock.l_start = 0; /* ΠΠ°ΡΠ°Π»ΠΎ ΡΠ°ΠΉΠ»Π° */
lock.l_len = 0; /* ΠΠΎ ΠΊΠΎΠ½ΡΠ° ΡΠ°ΠΉΠ»Π° */
Π‘ΠΏΡΠ°Π²ΠΎΡΠ½Π°Ρ ΡΡΡΠ°Π½ΠΈΡΠ° fnctl(3) ΠΈΠΌΠ΅Π΅Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅:
POSIX 1003.1-2001 Π΄ΠΎΠΏΡΡΠΊΠ°Π΅Ρ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ l_len. (Π Π΅ΡΠ»ΠΈ ΡΡΠΎ ΡΠ°ΠΊ, ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΠΌΡΠΉ Π±Π»ΠΎΠΊΠΎΠΌ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π» ΠΎΡ Π²Π°ΡΡΠ²Π°Π΅Ρ Π±Π°ΠΉΡΡ Ρ l_start + l_len Π²ΠΏΠ»ΠΎΡΡ Π΄ΠΎ l_start - 1 Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ.) ΠΠ΄Π½Π°ΠΊΠΎ, Π² ΡΡΠΎΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² Linux Π΄Π»Ρ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠ΄Π΅Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ EINVAL.
(ΠΡ Π·Π°ΠΌΠ΅ΡΠΈΠ»ΠΈ, ΡΡΠΎ ΡΠΏΡΠ°Π²ΠΎΡΠ½Π°Ρ ΡΡΡΠ°Π½ΠΈΡΠ° ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊ Π²Π΅ΡΡΠΈΡΠΌ ΡΠ΄Π΅Ρ 2.4.x; ΡΡΠΎΠΈΡ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΠ΅ΠΊΡΡΡΡ ΡΠΏΡΠ°Π²ΠΎΡΠ½ΡΡ ΡΡΡΠ°Π½ΠΈΡΡ, Π΅ΡΠ»ΠΈ Π²Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° Π½ΠΎΠ²Π΅Π΅.)
Π’Π΅ΠΏΠ΅ΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ Π·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΎΠΏΠΈΡΠ°ΡΡ Π³Π΄Π΅ Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ ΡΠ°ΠΉΠ», ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΠΈΡΠ°ΡΡ ΡΠΈΠΏ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ l_type. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅:
F_RDLCK ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΡΡΠ΅Π½ΠΈΡ. ΠΠ»Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΎΡΠΊΡΡΡ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ.
F_WRLCK ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π·Π°ΠΏΠΈΡΠΈ. ΠΠ»Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π·Π°ΠΏΠΈΡΠΈ ΡΠ°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΎΡΠΊΡΡΡ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ.
F_UNLCK ΠΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΏΠΎΠ»Π½Π°Ρ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΡ Π² ΡΡΡΡΠΊΡΡΡΠ΅ struct flock Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΡΠ΅ΡΡΡΠ΅Ρ ΠΏΠΎΠ»Π΅ΠΉ: ΡΡΠ΅Ρ Π΄Π»Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΡ Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ ΠΈ ΡΠ΅ΡΠ²Π΅ΡΡΠΎΠ³ΠΎ Π΄Π»Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ Π½ΡΠΆΠ½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Π±Π»ΠΎΠΊΠ°.
ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ F_UNLCK Π΄Π»Ρ l_type ΡΠ½ΠΈΠΌΠ°Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ. Π ΠΎΠ±ΡΠ΅ΠΌ, ΡΡΠΎ ΠΏΡΠΎΡΡΠ΅ΠΉΡΠΈΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠ½ΡΡΡ ΡΠ΅ ΡΠ°ΠΌΡΠ΅ Π±Π»ΠΎΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ»ΠΈ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Ρ ΡΠ°Π½Π΅Π΅, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Β«ΡΠ°ΡΡΠ΅ΠΏΠΈΡΡΒ» Π±Π»ΠΎΠΊ, ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΠ² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π±Π°ΠΉΡΠΎΠ² Π² ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Π΅ ΡΠ°Π½Π΅Π΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΊΡΡΠΏΠ½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
struct employee { /* ΡΡΠΎ ΡΠ³ΠΎΠ΄Π½ΠΎ */ }; /* ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΠΎΡΡΡΠ΄Π½ΠΈΠΊΠ° */
struct flock lock; /* Π‘ΡΡΡΠΊΡΡΡΠ° Π±Π»ΠΎΠΊΠ° */
...
/* ΠΠ°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΡΡΡΠ΄Π½ΠΈΠΊΠΎΠ² 6-8 */