ΠΠ°ΠΊ ΠΈ Π² ΡΠ»ΡΡΠ°Π΅
F_GETLKl_startl_whencel_lenflockfcntlΠΠΎΠΌΠ°Π½Π΄Π°
F_SETLKWF_SETLKΠΡΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΠ°ΠΉΠ»Π°, ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΡΠΈΡΠ°ΡΡΡΡ, ΠΊΠΎΠ³Π΄Π° Π·Π°ΠΊΡΡΠ²Π°Π΅ΡΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠ°ΠΉΠ»Π°. Π’ΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ.
ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π²ΡΠ·ΠΎΠ²ΠΎΠ² read ΠΈ write ΠΏΡΠΈ Π½Π°Π»ΠΈΡΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ
ΠΠΎΠ³Π΄Π° Π²Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΡΡΠ°ΡΡΠΊΠΎΠ² ΡΠ°ΠΉΠ»Π°, ΠΎΡΠ΅Π½Ρ Π²Π°ΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π΄Π°Π½Π½ΡΠΌ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ
readwritefreadfwritefreadfwritefreadfreadreadΠΠ»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΏΠΎΠ½ΡΡΡ, Π² ΡΠ΅ΠΌ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π΄Π²Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Ρ ΠΎΡΡΡ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΡΠ°ΠΉΠ». ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ ΡΠ°ΠΉΠ» ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ 200 Π±Π°ΠΉΡΠΎΠ² Π΄Π°Π½Π½ΡΡ , Π²ΡΠ΅ Π½ΡΠ»ΠΈ. ΠΠ΅ΡΠ²Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π½Π°ΡΠΈΠ½Π°Π΅Ρ ΡΠ°Π±ΠΎΡΡ ΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π½Π° Π·Π°ΠΏΠΈΡΡ Π΄Π»Ρ ΠΏΠ΅ΡΠ²ΡΡ 100 Π±Π°ΠΉΡΠΎΠ² ΡΠ°ΠΉΠ»Π°. ΠΠ°ΡΠ΅ΠΌ ΠΎΠ½Π° ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΡ
freadfreadBUFSIZΠΠ°ΡΠ΅ΠΌ ΡΡΠ°ΡΡΡΠ΅Ρ Π²ΡΠΎΡΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°. ΠΠ½Π° ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ
writefreadreadwriteΠΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΠ°ΠΉΠ»Π° ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡΡΡ ΡΠ»ΠΎΠΆΠ½ΠΎΠ²Π°ΡΡΠΌ, Π½ΠΎ Π΅Π΅ ΡΡΡΠ΄Π½Π΅Π΅ ΠΎΠΏΠΈΡΠ°ΡΡ, ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ. ΠΠΎΡΡΠΎΠΌΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.9.
fcntlΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ°Π±ΠΎΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΠ°ΠΉΠ»Π° Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ lock3.Ρ. ΠΠ»Ρ ΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°Π½ΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π²Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΡΡΡΡ Π΄Π²Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ: ΠΎΠ΄Π½Π° Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΈ Π΄ΡΡΠ³Π°Ρ Π΄Π»Ρ Π΅Π΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠ΅ΡΠ²Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ.
1.Β ΠΠ°ΡΠ½ΠΈΡΠ΅ Ρ ΡΠ°ΠΉΠ»ΠΎΠ²
include#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <fcntl.h>const char *test_file = "/tmp/test_lock";int main() {Β int file desc;Β int byte_count;Β char *byte_to_write = "A";Β struct flock region_1;Β struct flock region_2;Β int res;2.Β ΠΡΠΊΡΠΎΠΉΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ:
Β file_desc = open(test_file, O_RDWR | O_CREAT, 0666);Β if (!file_desc) {Β fprintf(stderr, "Unable to open %s for read/write\n", test_file);Β Β exit(EXIT_FAILURE);Β }3.Β ΠΠΎΠΌΠ΅ΡΡΠΈΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π² ΡΠ°ΠΉΠ»:
Β for (byte_count = 0; byte_count < 100; byte_count++) {Β Β (void)write(file_desc, byte_to_write, 1);Β }4.Β ΠΠ°Π΄Π°ΠΉΡΠ΅ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π΄Π»Ρ ΡΡΠ°ΡΡΠΊΠ° region 1 Ρ 10-Π³ΠΎ Π±Π°ΠΉΡΠ° ΠΏΠΎ 30-ΠΉ:
Β region_1.l_type = F_RDLCK;Β region_1.l_whence = SEEK_SET;Β region_1.l_start = 10;Β region_1.l_len = 20;5.Β ΠΠ°Π΄Π°ΠΉΡΠ΅ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π΄Π»Ρ ΡΡΠ°ΡΡΠΊΠ° region_2 Ρ 40-Π³ΠΎ Π±Π°ΠΉΡΠ° ΠΏΠΎ 50-ΠΉ:
Β region_2.l_type = F_WRLCK;Β region_2.l_whence = SEEK_SET;Β region_2.l_start = 40;Β region_2.l_len = 10;6.Β Π’Π΅ΠΏΠ΅ΡΡ Π·Π°Π±Π»ΠΎΠΊΠΈΡΡΠΉΡΠ΅ ΡΠ°ΠΉΠ»:
Β printf("Process %d locking file\n", getpid());Β res = fcntl(file_desc, F_SETLK, &region_1);Β if (res == -1) fprintf(stderr, "Failed to lock region 1\n");Β res = fcntl(file_desc, F_SETLK, &region_2);Β if (res = fprintf(stderr, "Failed to lock region 2\n");7.Β ΠΠΎΠ΄ΠΎΠΆΠ΄ΠΈΡΠ΅ ΠΊΠ°ΠΊΠΎΠ΅-ΡΠΎ Π²ΡΠ΅ΠΌΡ:
Β sleep(60);Β printf ("Process %d closing file\n", getpid());Β close(file_desc);Β exit(EXIT_SUCCESS);}ΠΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
Π‘Π½Π°ΡΠ°Π»Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠ°ΠΉΠ», ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ Π΅Π³ΠΎ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ ΠΈ Π·Π°ΡΠ΅ΠΌ Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠ°ΠΉΠ» Π΄Π°Π½Π½ΡΠΌΠΈ. ΠΠ°Π»Π΅Π΅ Π·Π°Π΄Π°ΡΡΡΡ Π΄Π²Π° ΡΡΠ°ΡΡΠΊΠ°: ΠΏΠ΅ΡΠ²ΡΠΉ Ρ 10-Π³ΠΎ ΠΏΠΎ 30-ΠΉ Π±Π°ΠΉΡ Π΄Π»Ρ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΈ Π²ΡΠΎΡΠΎΠΉ Ρ 40-Π³ΠΎ ΠΏΠΎ 50-ΠΉ Π±Π°ΠΉΡ Π΄Π»Ρ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ. ΠΠ°ΡΠ΅ΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π²ΡΠ·ΠΎΠ²
fcntl