Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 122

Автор ΠœΡΡ‚ΡŒΡŽ НСйл

Β }

Β 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));

Β res = fcntl(file_desc, F_SETLK, &region_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_WRLCK;

Β region_to_lock.l_whence = SEEK_SET;

Β region_to_lock.lstart = 16;

Β region_to_lock.l_len = 5;

Β printf("Process %d, trying F_WRLCK, 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, &region_to_lock);

Β if (res == -1) {

Β  printf("Process %d β€” failed to lock region\n", getpid());

Β } else {

Β  printf("Process %d β€” obtained lock on region\n", getpid());

Β }

Β region_to_lock.l_type = F_RDLCK;

Β region_to_lock.l_whence = SEEK_SET;

Β region_to_lock.l_start = 40;

Β region_to_lock.l_len = 10;

Β 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(filedesc, F_SETLK, &region_to_lock);

Β if (res == -1) {

Β  printf("Process %d β€” failed to lock region\n", getpid());

Β } else {

Β  printf("Process %d β€” obtained lock on region\n", getpid());

Β }

Β region_to_lock.l_type = F_WRLCK;

Β region_to_lock.l_whence = SEEK_SET;

Β region_to_lock.l_start = 16;

Β region_to_lock. l_len = 5;

Β printf("Process %d, trying F_WRLCK with wait, 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_SETLKW, &region_to_lock);

Β if (res == -1) {

Β  printf("Process %d β€” failed to lock region\n", getpid());

Β } else {

Β  printf("Process %d β€” obtained lock, on region\n", getpid());

Β }

printf ("Process %d ending\n", getpid());

Β close(file_desc);

Β exit(EXIT_SUCCESS);

}

Если Π²Ρ‹ сначала запуститС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ lock3 Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, Π΄Π°Π»Π΅Π΅ сразу запускайтС Π½ΠΎΠ²ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ:

$ .<b>/lock3 &amp;</b>

$ process 227 locking file

$ <b>./lock5</b>

Π’Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π²ΠΎΠ΄:

Process 227 locking file

Process 228, trying F_RDLCK, region 10 to 15

Process 228 β€” obtained lock on region

Process 228, trying F_UNLCK, region 10 to 15

Process 228 β€” unlocked region

Process 228, trying F_UNLCK, region 0 to 50

Process 228 β€” unlocked region

Process 228, trying F_WRLCK, region 16 to 21

Process 228 β€” failed to lock on region

Process 228, trying F_RDLCK, region 4 0 to 50

Process 228 - failed to lock on region

Process 228, trying F_WRLCK with wait, region 16 to 21

Process 227 closing file

Process 228 β€” obtained lock on region

Process 228 ending

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

Π‘Π½Π°Ρ‡Π°Π»Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° пытаСтся Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ участок с 10-Π³ΠΎ ΠΏΠΎ 15-ΠΉ Π±Π°ΠΉΡ‚Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ раздСляСмой Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. Π­Ρ‚Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΡƒΠΆΠ΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ°, Π½ΠΎ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ раздСляСмыС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ допустимы, ΠΈ установка Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ.

Π—Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° снимаСт свою Ρ€Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ с участка Ρ„Π°ΠΉΠ»Π°, ΠΈ эта опСрация Ρ‚ΠΎΠΆΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ. Π”Π°Π»Π΅Π΅ ΠΎΠ½Π° пытаСтся Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 50 Π±Π°ΠΉΡ‚ΠΎΠ² Ρ„Π°ΠΉΠ»Π°, Π΄Π°ΠΆΠ΅ Ссли Ρƒ Π½ΠΈΡ… Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. Π­Ρ‚ΠΎ дСйствиС Ρ‚ΠΎΠΆΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ, нСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ установила Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ Π½Π° этот участок, ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ запроса Π½Π° снятиС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² констатации Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ для ΠΏΠ΅Ρ€Π²Ρ‹Ρ… 50 Π±Π°ΠΉΡ‚ΠΎΠ² данная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ.

Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° пытаСтся Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ участок с 16-Ρ‚ΠΎ ΠΏΠΎ 21-ΠΉ Π±Π°ΠΉΡ‚Ρ‹ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ. Π­Ρ‚Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΡƒΠΆΠ΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π° раздСляСмой Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ, поэтому новая ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎ, Ρ‚.ΠΊ. Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ создана ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°.Β 

ПослС этого ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΡ€ΠΎΠ±ΡƒΠ΅Ρ‚ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Π½Π° участок с 40-Π³ΠΎ ΠΏΠΎ 50-ΠΉ Π±Π°ΠΉΡ‚Ρ‹. Π­Ρ‚Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΡƒΠΆΠ΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π° ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ, поэтому данная опСрация снова Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎ.

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΠΏΡΡ‚ΡŒ пытаСтся ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ для участка с 16-Π³ΠΎ ΠΏΠΎ 21-ΠΉ Π±Π°ΠΉΡ‚Ρ‹, Π½ΠΎ Π² этот Ρ€Π°Π· ΠΎΠ½Π° примСняСт ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ

F_SETLKW
, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΡƒΡŽ ΠΆΠ΄Π°Ρ‚ΡŒ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ установлСна. Π’ Π²Ρ‹Π²ΠΎΠ΄Π΅ наступаСт долгая ΠΏΠ°ΡƒΠ·Π°, длящаяся, ΠΏΠΎΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° lock3, Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π²ΡˆΠ°Ρ этот участок, Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Π²Ρ‹Π·ΠΎΠ²
sleep
ΠΈ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ», Ρ‚Π΅ΠΌ самым снимая всС установлСнныС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° lock5 возобновляСт Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ участок Ρ„Π°ΠΉΠ»Π° ΠΈ Π·Π°Ρ‚Π΅ΠΌ Ρ‚ΠΎΠΆΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ.