ΠΠ° ΡΠΈΡ. 7.1 ΠΏΠΎΠΊΠ°Π·Π°Π½ ΡΡΠΎΡ ΡΡΠ΅Π½Π°ΡΠΈΠΉ Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ°ΠΌΠΈ Π² ΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡ ΠΊ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ.
Π ΠΈΡ. 7.1
Π‘Π°ΠΌΠ° ΠΏΠΎ ΡΠ΅Π±Π΅ ΡΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π½Π΅ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΠ»Π΅Π·Π½Π°. ΠΠ°ΠΌ Π½ΡΠΆΠ½Π° Π²ΡΠΎΡΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° lock4.c Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ (ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.10).
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.10. Π’Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ ΡΠ°ΠΉΠ»Π°Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π²Ρ Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΏΡΠΎΠ²Π΅ΡΡΡΡΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΠ°Π·Π½ΡΡ ΡΠΈΠΏΠΎΠ², ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠ΅ Π΄Π»Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΡΠ°ΡΡΠΊΠΎΠ² ΡΠ°ΠΉΠ»Π°.
1. ΠΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΠΎ, Π½Π°ΡΠ½Π΅ΠΌ Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠΉ:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
const char *test_file = "/tmp/test_lock";
#define SIZE_TO_TRY 5
void show_lock_info(struct flock *to_show);
int main() {
int file_desc;
int res;
struct flock region_to_test;
int start_byte;
2. ΠΡΠΊΡΠΎΠΉΡΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠ°ΠΉΠ»Π°:
file_desc = open(test_file, O_RDWR | O_CREAT, 0666);
if (!file_desc) {
fprintf(stderr, "Unable to open %s for read/write", test_file);
exit(EXIT_FAILURE);
}
for (start_byte = 0; start_byte < 99; start_byte += SIZE_TO_TRY) {
3. ΠΠ°Π΄Π°ΠΉΡΠ΅ ΡΡΠ°ΡΡΠΎΠΊ ΡΠ°ΠΉΠ»Π°, ΠΊΠΎΡΠΎΡΡΠΉ Ρ ΠΎΡΠΈΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ:
region_to_test.l_type = F_WRLCK;
region_to_test.l_whence = SEEK_SET;
region_to_test.lstart = start_byte;
region_to_test.l_len = SIZE_TO_TRY;
region_to_test.l_pid = -1;
printf("Testing F_WRLCK on region from %d to %d\n", start_byte, start_byte + SIZE_TO_TRY);
4. Π’Π΅ΠΏΠ΅ΡΡ ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΡΠ°ΠΉΠ»Π°:
res = fcntl(file_desc, F_GETLK, ®ion_to_test);
if (res == -1) {
fprintf(stderr, "F_GETLK failed\n");
exit(EXIT_FAILURE);
}
if (region_to_test.l_pid != -1) {
printf("Lock would fail. F_GETLK returned:\n");
showlockinfo(®ion_to_test);
} else {
printf("F_WRLCK - Lock would succeed\n");
}
5. ΠΠ°Π»Π΅Π΅ ΠΏΠΎΠ²ΡΠΎΡΠΈΡΠ΅ ΡΠ΅ΡΡ Ρ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΎΠΉ (Π½Π° ΡΡΠ΅Π½ΠΈΠ΅). Π‘Π½ΠΎΠ²Π° Π·Π°Π΄Π°ΠΉΡΠ΅ ΡΡΠ°ΡΡΠΎΠΊ ΡΠ°ΠΉΠ»Π°, ΠΊΠΎΡΠΎΡΡΠΉ Ρ ΠΎΡΠΈΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ:
region_to_test.l_type = F_RDLCK;
region_to_test.l_whence = SEEK_SET;
region_to_test.l_start = start_byte;
region_to_test.l_len = SIZE_TO_TRY;
region_to_test.l_pid = -1;
printf("Testing F_RDLCK on region from %d to %d\n", start_byte, start_byte + SIZE_TO_TRY);
6. ΠΡΠ΅ ΡΠ°Π· ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΡΠ°ΠΉΠ»Π°:
res = fcntl(file_desc, F_GETLK, ®ion_to_test);
if (res == -1) {
fprintf(stderr, "F_GETLK failed\n");
exit(EXIT_FAILURE);
}
if (region_to_test.l_pid != -1) {
printf("Lock would fail. F_GETLK returned:\n");
show_lock_info(®ion_to_test);
} else {
printf("F_RDLCK β Lock would succeed\n");
}
}
close(file_desc);
exit(EXIT_SUCCESS);
}
void show_lock_info(struct flock *to_show) {
printf("\tl_type %d, ", to_show->l_type);
printf("l_whence %d, ", to_show->l_whence);
printf("l_start %d, (int)to_show->l_start);
printf("l_len %d, ", (int)to_show->l_len);
printf("l_pid %d\n", to_show->l_pid);
}
ΠΠ»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΠ½Π°ΡΠ°Π»Π° Π·Π°ΠΏΡΡΡΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ lock3, Π·Π°ΡΠ΅ΠΌ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ lock4, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ°ΠΉΠ». Π‘Π΄Π΅Π»Π°ΠΉΡΠ΅ ΡΡΠΎ, Π·Π°ΠΏΡΡΡΠΈΠ² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ lock3 Π² ΡΠΎΠ½ΠΎΠ²ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
$ ./lock3 &
$ process 1534 locking file
ΠΠ° ΡΠΊΡΠ°Π½Π΅ ΠΏΠΎΡΠ²ΠΈΡΡΡ ΠΏΡΠΈΠ³Π»Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ Π²Π²ΠΎΠ΄Π° ΠΊΠΎΠΌΠ°Π½Π΄, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ lock3 Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π² ΡΠΎΠ½ΠΎΠ²ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅. ΠΠ°Π»Π΅Π΅ ΡΡΠ°Π·Ρ ΠΆΠ΅ Π·Π°ΠΏΡΡΡΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ lock4 Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
$ ./lock4
ΠΡ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Π²ΡΠ²ΠΎΠ΄, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΉ Π΄Π°Π»Π΅Π΅ Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΏΡΠΎΠΏΡΡΠΊΠ°ΠΌΠΈ Π΄Π»Ρ ΠΊΡΠ°ΡΠΊΠΎΡΡΠΈ:
Testing F_WRLCK on region from 0 to 5
F_WRLCK β Lock would succeed
Testing F_RDLCK on region from 0 to 5
F_RDLCK - Lock would succeed
...
Testing F_WRLCK on region from 10 to 15
Lock would fail. F_GETLK returned:
l_type 0, l_whence 0, l_start 10, l_len 20, l_pid 1534
Testing F_RDLCK on region from 10 to 15
F_RDLCK β Lock would succeed
Testing F_WRLCK on region from 15 to 20
Lock would fail. F_GETLK returned:
l_type 0, l_whence 0, l_start 10, l_len 20, l_pid 1534
Testing F_RDLCK on region from 15 to 20
F_RDLCK β Lock would succeed
...
Testing F_WRLCK on region from 25 to 30
Lock would fail. F_GETLK returned:
l_type 0, l_whence 0, l_start 10, l_len 20, l_pid 1534
Testing F_RDLCK on region from 25 to 30
F_RDLCK β Lock would succeed
...
Testing F_WRLCK on region from 40 to 45
Lock would fail. F_GETLK returned:
l_type 1, l_whence 0, l_start 40, l_len 10, l_pid 1534
Testing F_RDLCK on region from 40 to 45
Lock would fail. F_GETLK returned:
l_type 1, l_whence 0, l_start 40, l_len 10, l_pid 1534
...
Testing F_RDLCK on region from 95 to 100
F_RDLCK - Lock would succeed
ΠΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π³ΡΡΠΏΠΏΡ ΠΈΠ· ΠΏΡΡΠΈ Π±Π°ΠΉΡΠΎΠ² Π² ΡΠ°ΠΉΠ»Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° lock4 Π·Π°Π΄Π°Π΅Ρ ΡΡΡΡΠΊΡΡΡΡ ΡΡΠ°ΡΡΠΊΠ° ΡΠ°ΠΉΠ»Π° Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ, ΠΊΠΎΡΠΎΡΡΡ ΠΎΠ½Π° ΠΏΠΎΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅Ρ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ΅Ρ Π»ΠΈ ΡΡΠΎΡ ΡΡΠ°ΡΡΠΎΠΊ Π±ΡΡΡ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΠΈ. ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠ°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π±Π°ΠΉΡΡ, ΠΎΡΠ½ΠΎΡΡΡΠΈΠ΅ΡΡ ΠΊ ΡΡΠ°ΡΡΠΊΡ ΡΠ°ΠΉΠ»Π°, ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΎΡ Π½ΡΠ»Π΅Π²ΠΎΠ³ΠΎ Π±Π°ΠΉΡΠ°, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΠΎΠ³Π»ΠΎ Π±Ρ Π²ΡΠ·Π²Π°ΡΡ Π°Π²Π°ΡΠΈΠΉΠ½ΠΎΠ΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΠ° Π½Π° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΠΎΠ»Π΅ l_pid Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠΉ ΡΡΡΡΠΊΡΡΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π²Π»Π°Π΄Π΅ΡΡΠ΅ΠΉ Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ ΡΠ°ΠΉΠ»ΠΎΠΌ, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π·Π°Π΄Π°Π΅Ρ Π΅ΠΌΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ -1 (Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅) ΠΈ Π·Π°ΡΠ΅ΠΌ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ, ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΎΡΡ Π»ΠΈ ΠΎΠ½ΠΎ ΠΏΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΡΠ·ΠΎΠ²Π° fcntl. ΠΡΠ»ΠΈ ΡΡΠ°ΡΡΠΎΠΊ Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π½Π΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½, ΠΏΠΎΠ»Π΅ l_pid Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡΡ.
ΠΠ»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΏΠΎΠ½ΡΡΡ Π²ΡΠ²ΠΎΠ΄, ΡΠ»Π΅Π΄ΡΠ΅Ρ Π·Π°Π³Π»ΡΠ½ΡΡΡ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» fcntl.h (ΠΎΠ±ΡΡΠ½ΠΎ /usr/include/fcntl.h) ΠΈ ΡΠ²ΠΈΠ΄Π΅ΡΡ, ΡΡΠΎ ΠΏΠΎΠ»Π΅ l_type, ΡΠ°Π²Π½ΠΎΠ΅ 1, Π²ΡΡΠ΅ΠΊΠ°Π΅Ρ ΠΈΠ· ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ F_WRLCK ΠΊΠ°ΠΊ 1, Π° ΡΠ°Π²Π½ΠΎΠ΅ 0 ΠΈΠ· ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ F_RDLCK ΠΊΠ°ΠΊ 0. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΏΠΎΠ»Π΅ l_type, ΡΠ°Π²Π½ΠΎΠ΅ 1, Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π½Π° Π·Π°ΠΏΠΈΡΡ, Π° ΠΏΠΎΠ»Π΅ l_type, ΡΠ°Π²Π½ΠΎΠ΅ 0, ΡΠ²ΠΈΠ΄Π΅ΡΠ΅Π»ΡΡΡΠ²ΡΠ΅Ρ ΠΎ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅. ΠΠ»Ρ ΡΠ΅Ρ ΡΡΠ°ΡΡΠΊΠΎΠ² ΡΠ°ΠΉΠ»Π°, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π»Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° lock3, ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Ρ ΠΈ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠ°Ρ, ΠΈ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ.
ΠΠ»Ρ Π±Π°ΠΉΡΠΎΠ² Ρ 10-Π³ΠΎ ΠΏΠΎ 30-ΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ°, ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ lock3, Π½Π΅ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½Π°Ρ, Π° ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠ°Ρ. ΠΠ»Ρ ΡΡΠ°ΡΡΠΊΠ° Ρ 40-Π³ΠΎ ΠΏΠΎ 50-ΠΉ Π±Π°ΠΉΡ Π½Π΅Π»ΡΠ·Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΎΠ±Π° ΡΠΈΠΏΠ° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ lock3 Π·Π°Π΄Π°Π»Π° ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΡΡ (F_WRLCK) Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΡΠ°ΡΡΠΊΠ°.
ΠΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ lock4 Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°ΡΡ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° lock3 Π·Π°Π²Π΅ΡΡΠΈΠ»Π° Π²ΡΠ·ΠΎΠ² sleep ΠΈ Π·Π°ΠΊΠΎΠ½ΡΠΈΠ»Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅.
ΠΠΎΠ½ΠΊΡΡΠΈΡΡΡΡΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ
Π’Π΅ΠΏΠ΅ΡΡ, ΠΊΠΎΠ³Π΄Π° Π²Ρ ΡΠ²ΠΈΠ΄Π΅Π»ΠΈ, ΠΊΠ°ΠΊ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΠ°ΠΉΠ»Π°, Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΡΡΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ, ΠΊΠΎΠ³Π΄Π° Π΄Π²Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΠΎΡΡΡΠ·Π°ΡΡΡΡ Π·Π° ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΡΡΠ°ΡΡΠΊΠ° ΡΠ°ΠΉΠ»Π°. ΠΡ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ΡΡ ΡΠ½ΠΎΠ²Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ lock3 Π΄Π»Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΠ°ΠΉΠ»Π° ΠΈ Π½ΠΎΠ²ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ lock5 Π΄Π»Ρ ΠΏΠΎΠΏΡΡΠΊΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π½ΠΎΠ²ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΡΠ°ΠΉΠ»Π°. Π Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ Π²Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ lock5 Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²ΡΠ·ΠΎΠ²ΠΎΠ² Π΄Π»Ρ ΡΠ½ΡΡΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ (ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.11).
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.11. ΠΠΎΠ½ΠΊΡΡΠΈΡΡΡΡΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈΠΠ°Π»Π΅Π΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° lock5.Ρ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΡΠ°Π΅ΡΡΡ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΡΠΆΠ΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΡΠ°ΡΡΠΊΠΈ ΡΠ°ΠΉΠ»Π° Π²ΠΌΠ΅ΡΡΠΎ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π΄ΡΡΠ³ΠΈΡ ΡΠ°ΡΡΠ΅ΠΉ ΡΠ°ΠΉΠ»Π°.
ΠΠΎΡΠ»Π΅ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ² #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;
struct flock region_to_lock;
int res;
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);
}
Π ΠΎΡΡΠ°Π²ΡΠ΅ΠΉΡΡ ΡΠ°ΡΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π·Π°Π΄Π°ΡΡΡΡ ΡΠ°Π·Π½ΡΠ΅ ΡΡΠ°ΡΡΠΊΠΈ ΡΠ°ΠΉΠ»Π°, ΠΈ Π΄Π΅Π»Π°Π΅ΡΡΡ ΠΏΠΎΠΏΡΡΠΊΠ° ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π΄Π»Ρ Π½ΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΠ°Π·Π½ΡΡ ΡΠΈΠΏΠΎΠ²:
region_to_lock.l_type = F_RDLCK;
region_to_lock.l_whence = SEEK_SET;
region_to_lock.l_start = 10;
region_to_lock.l_len = 5;
printf("Process %d, trying F_RDLCK, region %d to %d\n", getpid(), (int)region_to_lock.l_start,
(int)(region_to_lock.l_start + region_to_lock.l_len));
res = fcntl(file_desc, F_SETLK, ®ion_to_lock);
if (res == -1) {
printf("Process %d - failed to lock region\n", getpid());
} else {
printf("Process %d β obtained lock region\n", getpid());
}
region_to_lock.l_type = F_UNLCK;
region_to_lock.l_whence = SEEK_SET;
region_to_lock.l_start = 10;
region_to_lock.l_len = 5;
printf("Process %d, trying F_UNLCK, region %d to %d\n", getpid(), (int)region_to_lock.l_start,
(int)(region_to_lock.l_start + region_to_lock.l_len));
res = fcntl(file_desc, F_SETLK, ®ion_to_lock);
if (res == -1) {
printf("Process %d β failed to unlock region\n", getpid());
} else {
printf("Process %d β unlocked region\n", getpid());
}
region_to_lock.l_type = F_UNLCK;
region_to_lock.l_whence = SEEK_SET;
region_to_lock.l_start = 0;
region_to_lock.l_len = 50;
printf("Process %d, trying F_UNLCK, region %d to %d\n", getpid()", (int)region_to_lock.l_start,
(int)(region_to_lock.l_start + region_to_lock.l_len));