ΠΠ° ΡΠΈΡ. 7.1 ΠΏΠΎΠΊΠ°Π·Π°Π½ ΡΡΠΎΡ ΡΡΠ΅Π½Π°ΡΠΈΠΉ Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ°ΠΌΠΈ Π² ΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡ ΠΊ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ.

Π ΠΈΡ. 7.1
Π‘Π°ΠΌΠ° ΠΏΠΎ ΡΠ΅Π±Π΅ ΡΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π½Π΅ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΠ»Π΅Π·Π½Π°. ΠΠ°ΠΌ Π½ΡΠΆΠ½Π° Π²ΡΠΎΡΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° lock4.c Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ (ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 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 5void 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, &region_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(&region_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, &region_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(&region_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 Π² ΡΠΎΠ½ΠΎΠ²ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
$ <b>./lock3 &</b>$ process 1534 locking fileΠΠ° ΡΠΊΡΠ°Π½Π΅ ΠΏΠΎΡΠ²ΠΈΡΡΡ ΠΏΡΠΈΠ³Π»Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ Π²Π²ΠΎΠ΄Π° ΠΊΠΎΠΌΠ°Π½Π΄, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ lock3 Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π² ΡΠΎΠ½ΠΎΠ²ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅. ΠΠ°Π»Π΅Π΅ ΡΡΠ°Π·Ρ ΠΆΠ΅ Π·Π°ΠΏΡΡΡΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ lock4 Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
$ <b>./lock4</b>ΠΡ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Π²ΡΠ²ΠΎΠ΄, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΉ Π΄Π°Π»Π΅Π΅ Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΏΡΠΎΠΏΡΡΠΊΠ°ΠΌΠΈ Π΄Π»Ρ ΠΊΡΠ°ΡΠΊΠΎΡΡΠΈ:
Testing F_WRLCK on region from 0 to 5F_WRLCK β Lock would succeedTesting F_RDLCK on region from 0 to 5F_RDLCK - Lock would succeed...Testing F_WRLCK on region from 10 to 15Lock would fail. F_GETLK returned:l_type 0, l_whence 0, l_start 10, l_len 20, l_pid 1534Testing F_RDLCK on region from 10 to 15F_RDLCK β Lock would succeedTesting F_WRLCK on region from 15 to 20Lock would fail. F_GETLK returned: