Чтение онлайн

на главную

Жанры

Основы программирования в Linux
Шрифт:

 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 в фоновом режиме, далее сразу запускайте новую программу:

$ ./lock3 &

$ process 227 locking file

$ ./lock5

Вы получите следующий вывод:

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 возобновляет выполнение, успешно блокирует участок файла и затем тоже завершается.

Поделиться:
Популярные книги

Хозяин Стужи 3

Петров Максим Николаевич
3. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
7.00
рейтинг книги
Хозяин Стужи 3

Петля, Кадетский корпус. Книга третья

Алексеев Евгений Артемович
3. Петля
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Петля, Кадетский корпус. Книга третья

Мастер 4

Чащин Валерий
4. Мастер
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Мастер 4

Сотник

Вязовский Алексей
2. Индийский поход
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Сотник

Второгодка. Книга 3. Ученье свет

Ромов Дмитрий
3. Второгодка
Фантастика:
городское фэнтези
сказочная фантастика
альтернативная история
5.00
рейтинг книги
Второгодка. Книга 3. Ученье свет

Телохранитель Генсека. Том 3

Алмазный Петр
3. Медведев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Телохранитель Генсека. Том 3

Газлайтер. Том 5

Володин Григорий
5. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 5

Снайпер

Поселягин Владимир Геннадьевич
3. Жнец
Фантастика:
боевая фантастика
попаданцы
5.60
рейтинг книги
Снайпер

Двойник короля 11

Скабер Артемий
11. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 11

Вперед в прошлое 2

Ратманов Денис
2. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 2

Кодекс Охотника. Книга XXVI

Винокуров Юрий
26. Кодекс Охотника
Фантастика:
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXVI

Жертва

Привалов Сергей
2. Звездный Бродяга
Фантастика:
боевая фантастика
космическая фантастика
рпг
попаданцы
5.00
рейтинг книги
Жертва

Первый среди равных. Книга III

Бор Жорж
3. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
6.00
рейтинг книги
Первый среди равных. Книга III

Проводник

Кораблев Родион
2. Другая сторона
Фантастика:
боевая фантастика
рпг
7.41
рейтинг книги
Проводник