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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «АрхитСктура ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы UNIXΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 29

Автор ΠœΠΎΡ€ΠΈΡ Π‘Π°Ρ…

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΉ вСрсии систСмы UNIX, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠΉ Вомпсоном ΠΈ Π ΠΈΡ‡ΠΈ, отсутствовал Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ процСссу ΠΌΠΎΠ³ Π±Ρ‹ Π±Ρ‹Ρ‚ΡŒ обСспСчСн ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ доступ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ. ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π·Π°Ρ…Π²Π°Ρ‚Π° Π±Ρ‹Π» ΠΏΡ€ΠΈΠ·Π½Π°Π½ излишним, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ, ΠΊΠ°ΠΊ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π΅Ρ‚ Π ΠΈΡ‡ΠΈ, Β«ΠΌΡ‹ Π½Π΅ ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π΅Π»Π° с большими Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, состоящими ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ нСзависимыми процСссами» (см. [Ritchie 81]). Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ систСмы UNIX для коммСрчСских ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… с Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, Π² Π²Π΅Ρ€ΡΠΈΡŽ V систСмы Π½Ρ‹Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ Π·Π°Ρ…Π²Π°Ρ‚Π° Ρ„Π°ΠΉΠ»Π° ΠΈ записи. Π—Π°Ρ…Π²Π°Ρ‚ Ρ„Π°ΠΉΠ»Π° β€” это срСдство, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π΅ Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠΌ процСссам ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ запись любой части Ρ„Π°ΠΉΠ»Π°, Π° Π·Π°Ρ…Π²Π°Ρ‚ записи β€” это срСдство, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π΅ Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠΌ процСссам ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π²Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… записСй (частСй Ρ„Π°ΠΉΠ»Π° ΠΌΠ΅ΠΆΠ΄Ρƒ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌΠΈ смСщСниями). Π’ ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠΈ 5.9 рассматриваСтся рСализация ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Π·Π°Ρ…Π²Π°Ρ‚Π° Ρ„Π°ΠΉΠ»Π° ΠΈ записи.

5.5 Π£ΠšΠΠ—ΠΠΠ˜Π• ΠœΠ•Π‘Π’Π Π’ ЀАЙЛЕ, Π“Π”Π• Π‘Π£Π”Π•Π’ Π’Π«ΠŸΠžΠ›ΠΠ―Π’Π¬Π‘Π― Π’Π’ΠžΠ”-Π’Π«Π’ΠžΠ” β€” LSEEК

ΠžΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ использованиС систСмных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ read ΠΈ write обСспСчиваСт ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ доступ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ, ΠΎΠ΄Π½Π°ΠΊΠΎ процСссы ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ² систСмной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ lseek для указания мСста Π² Ρ„Π°ΠΉΠ»Π΅, Π³Π΄Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π²Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄, ΠΈ осущСствлСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ доступа ΠΊ Ρ„Π°ΠΉΠ»Ρƒ. Бинтаксис Π²Ρ‹Π·ΠΎΠ²Π° систСмной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:


position = lseek(fd, offset, reference);


Π³Π΄Π΅ fd β€” дСскриптор Ρ„Π°ΠΉΠ»Π°, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Π°ΠΉΠ», offset β€” смСщСниС Π² Π±Π°ΠΉΡ‚Π°Ρ…, Π° reference ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, являСтся Π»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ offset смСщСниСм ΠΎΡ‚ Π½Π°Ρ‡Π°Π»Π° Ρ„Π°ΠΉΠ»Π°, смСщСниСм ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠ»ΠΈ смСщСниСм ΠΎΡ‚ ΠΊΠΎΠ½Ρ†Π° Ρ„Π°ΠΉΠ»Π°. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, position, являСтся смСщСниСм Π² Π±Π°ΠΉΡ‚Π°Ρ… Π΄ΠΎ мСста, Π³Π΄Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ опСрация чтСния ΠΈΠ»ΠΈ записи. НапримСр, Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π½Π° РисункС 5.10, процСсс ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ», считываСт Π±Π°ΠΉΡ‚, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ lseek, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ поля смСщСния Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ² Π²Π΅Π»ΠΈΡ‡ΠΈΠ½ΠΎΠΉ, Ρ€Π°Π²Π½ΠΎΠΉ 1023 (с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ reference, ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1), ΠΈ выполняСт Ρ†ΠΈΠΊΠ». Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° считываСт ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ 1024-ΠΉ Π±Π°ΠΉΡ‚ Ρ„Π°ΠΉΠ»Π°. Если reference ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0, ядро осущСствляСт поиск ΠΎΡ‚ Π½Π°Ρ‡Π°Π»Π° Ρ„Π°ΠΉΠ»Π°, Π° Ссли 2, ядро Π²Π΅Π΄Π΅Ρ‚ поиск ΠΎΡ‚ ΠΊΠΎΠ½Ρ†Π° Ρ„Π°ΠΉΠ»Π°. Ѐункция lseek Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π΄Π΅Π»Π°Ρ‚ΡŒ, ΠΊΡ€ΠΎΠΌΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ поиска, которая ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ Π³ΠΎΠ»ΠΎΠ²ΠΊΡƒ чтСния-записи Π½Π° ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ дисковый сСктор. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ lseek, ядро просто Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ смСщСния ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Ρ„Π°ΠΉΠ»ΠΎΠ²; Π² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π²Ρ‹Π·ΠΎΠ²Π°Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ read ΠΈ write смСщСниС ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² качСствС Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ смСщСния.


#include β€Ήfcntl.hβ€Ί

main(argc, argv)

int argc; char *argv[];

{

 int fd, skval;

 char c;

 if (argc != 2) exit();

 fd = open(argv[1], O_RDONLY);

 if (fd == -1) exit();

 while ((skval = read(fd, &c,1 )) == 1)  {

  printf("char %c\n", c);

  skval = lseek(fd, 1023L, 1);

  printf("new seek val %d\n", skval);

 }

}

Рисунок 5.10. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, содСрТащая Π²Ρ‹Π·ΠΎΠ² систСмной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ lseek

5.6 CLOSΠ•

ΠŸΡ€ΠΎΡ†Π΅ΡΡ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΊΠΎΠ³Π΄Π° процСссу большС Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Π½Π΅ΠΌΡƒ. Бинтаксис Π²Ρ‹Π·ΠΎΠ²Π° систСмной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ close (Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ):


close(fd);


Π³Π΄Π΅ fd β€” дСскриптор ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. Π―Π΄Ρ€ΠΎ выполняСт ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ закрытия, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ дСскриптор Ρ„Π°ΠΉΠ»Π° ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈΠ· ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… записСй Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ индСксов. Если счСтчик ссылок Π² записи Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, большСС, Ρ‡Π΅ΠΌ 1, Π² связи с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΈ обращСния ΠΊ функциям dup ΠΈΠ»ΠΈ fork, Ρ‚ΠΎ это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π° запись Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ² Π΄Π΅Π»Π°ΡŽΡ‚ ссылку Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ дСскрипторы, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Π΄Π°Π»Π΅Π΅; ядро ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика ΠΈ опСрация закрытия Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ. Если счСтчик ссылок Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ€Π°Π²Π½ΠΎΠ΅ 1, ядро освобоТдаСт запись Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΈ индСкс Π² памяти, Ρ€Π°Π½Π΅Π΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ систСмной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ open (Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ iput). Если Π΄Ρ€ΡƒΠ³ΠΈΠ΅ процСссы всС Π΅Ρ‰Π΅ ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π½Π° индСкс, ядро ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика ссылок Π½Π° индСкс, Π½ΠΎ оставляСт индСкс процСссам; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС индСкс освобоТдаСтся для пСрСназначСния, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π΅Π³ΠΎ счСтчик ссылок содСрТит 0. Когда Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ систСмной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ close Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, запись Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… дСскрипторов Ρ„Π°ΠΉΠ»Π° становится пустой. ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠΈ процСсса ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΉ дСскриптор Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ ошибкой Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° дСскриптор Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π½Π°Π·Π½Π°Ρ‡Π΅Π½ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ выполнСния Π΄Ρ€ΡƒΠ³ΠΎΠΉ систСмной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Когда процСсс Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, ядро провСряСт Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… дСскрипторов Ρ„Π°ΠΉΠ»Π°, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Π²ΡˆΠΈΡ… процСссу, ΠΈ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ…. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π½ΠΈ ΠΎΠ΄ΠΈΠ½ процСсс Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ послС своСго Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ.

На РисункС 5.11, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ записи ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π½Π° РисункС 5.4, послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‚ΠΎΡ€ΠΎΠΉ процСсс Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΈΠΌ Ρ„Π°ΠΉΠ»Ρ‹. Записи, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ дСскрипторам 3 ΠΈ 4 Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… дСскрипторов Ρ„Π°ΠΉΠ»ΠΎΠ², пусты. Π‘Ρ‡Π΅Ρ‚Ρ‡ΠΈΠΊΠΈ Π² записях Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Ρ„Π°ΠΉΠ»ΠΎΠ² Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈΠΌΠ΅ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0, Π° сами записи пусты. Π‘Ρ‡Π΅Ρ‚Ρ‡ΠΈΠΊΠΈ ссылок Π½Π° Ρ„Π°ΠΉΠ»Ρ‹ Β«/etc/passwdΒ» ΠΈ Β«privateΒ» Π² индСксах Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠ»ΠΈΡΡŒ. ИндСкс для Ρ„Π°ΠΉΠ»Π° Β«privateΒ» находится Π² спискС свободных индСксов, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ счСтчик ссылок Π½Π° Π½Π΅Π³ΠΎ Ρ€Π°Π²Π΅Π½ 0, Π½ΠΎ запись ΠΎ Π½Π΅ΠΌ Π½Π΅ пуста. Если Π΅Ρ‰Π΅ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ процСсс обратится ΠΊ Ρ„Π°ΠΉΠ»Ρƒ Β«privateΒ», ΠΏΠΎΠΊΠ° индСкс Π΅Ρ‰Π΅ находится Π² спискС свободных индСксов, ядро вострСбуСт индСкс ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 4.1.2.


Рисунок 5.11. Π’Π°Π±Π»ΠΈΡ†Ρ‹ послС закрытия Ρ„Π°ΠΉΠ»Π°

5.7 Π‘ΠžΠ—Π”ΠΠΠ˜Π• ЀАЙЛА

БистСмная функция open Π΄Π°Π΅Ρ‚ процСссу доступ ΠΊ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ, Π° систСмная функция creat создаСт Π² систСмС Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ». Бинтаксис Π²Ρ‹Π·ΠΎΠ²Π° систСмной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ creat:


fd = creat(pathname, modes);


Π³Π΄Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ pathname, modes ΠΈ fd ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ смысл, Ρ‡Ρ‚ΠΎ ΠΈ Π² систСмной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ open. Если ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π½Π΅ сущСствовало, ядро создаСт Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ» с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΈ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌΠΈ ΠΏΡ€Π°Π²Π°ΠΌΠΈ доступа ΠΊ Π½Π΅ΠΌΡƒ; Ссли ΠΆΠ΅ Ρ‚Π°ΠΊΠΎΠΉ Ρ„Π°ΠΉΠ» ΡƒΠΆΠ΅ сущСствовал, ядро усСкаСт Ρ„Π°ΠΉΠ» (освобоТдаСт всС ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ устанавливаСт Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° Ρ€Π°Π²Π½Ρ‹ΠΌ 0) ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€Π°Π² доступа ΠΊ Π½Π΅ΠΌΡƒ[16]. На РисункС 5.12 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ создания Ρ„Π°ΠΉΠ»Π°.


Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ creat

входная информация:

 ΠΈΠΌΡ Ρ„Π°ΠΉΠ»Π°

 ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΊΠΈ ΠΏΡ€Π°Π² доступа ΠΊ Ρ„Π°ΠΉΠ»Ρƒ

выходная информация: дСскриптор Ρ„Π°ΠΉΠ»Π°

{

 ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ индСкс для Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° (Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ namei);

 if (Ρ„Π°ΠΉΠ» ΡƒΠΆΠ΅ сущСствуСт) {

  if (доступ Π½Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½) {

   ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ индСкс (Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ iput);

   return (ΠΎΡˆΠΈΠ±ΠΊΡƒ);

  }

 }

 else { /* Ρ„Π°ΠΉΠ» Π΅Ρ‰Π΅ Π½Π΅ сущСствуСт */

  Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ свободный индСкс ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы (Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ialloc);

  ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ Π²Ρ…ΠΎΠ΄Π° Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅;

  Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ имя Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΈ Π½ΠΎΠΌΠ΅Ρ€ вновь Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ индСкса;

 }

 Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ для индСкса запись Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ счСтчик;

 if (Ρ„Π°ΠΉΠ» сущСствовал ΠΊ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρƒ создания) ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ всС Π±Π»ΠΎΠΊΠΈ Ρ„Π°ΠΉΠ»Π° (Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ free);

 ΡΠ½ΡΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ (с индСкса);

 return (ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ дСскриптор Ρ„Π°ΠΉΠ»Π°);

}

Рисунок 5.12. Алгоритм создания Ρ„Π°ΠΉΠ»Π°


Π―Π΄Ρ€ΠΎ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ синтаксичСский Π°Π½Π°Π»ΠΈΠ· ΠΈΠΌΠ΅Π½ΠΈ ΠΏΡƒΡ‚ΠΈ поиска, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ namei ΠΈ слСдуя этому Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ, ΠΊΠΎΠ³Π΄Π° Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎ Ρ€Π°Π·Π±ΠΎΡ€Π΅ ΠΈΠΌΠ΅Π½ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ². Однако, ΠΊΠΎΠ³Π΄Π° Π΄Π΅Π»ΠΎ касаСтся послСднСй ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΡƒΡ‚ΠΈ поиска, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° создаваСмого Ρ„Π°ΠΉΠ»Π°, namei ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π΅Ρ‚ смСщСниС Π² Π±Π°ΠΉΡ‚Π°Ρ… Π΄ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΉ пустой ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠΈ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ это смСщСниС Π² пространствС процСсса. Если ядро Π½Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»ΠΎ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΡƒΡ‚ΠΈ поиска, ΠΎΠ½ΠΎ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ счСтС Π²ΠΏΠΈΡˆΠ΅Ρ‚ имя ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π² Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ Π½Π°ΠΉΠ΄Π΅Π½Π½ΡƒΡŽ ΠΏΡƒΡΡ‚ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ. Если Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Π½Π΅Ρ‚ пустых ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ, ядро Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ смСщСниС Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΈ создаСт Π½ΠΎΠ²ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Ρ‚Π°ΠΌ. Оно Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ Π² пространствС процСсса индСкс просматриваСмого ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΈ Π΄Π΅Ρ€ΠΆΠΈΡ‚ индСкс Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ; ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ становится ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ Π½ΠΎΠ²ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠΌ. Π―Π΄Ρ€ΠΎ Π½Π΅ записываСт ΠΏΠΎΠΊΠ° имя Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π² случаС возникновСния ошибок ядру приходится мСньшС ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»Ρ‹Π²Π°Ρ‚ΡŒ. Оно провСряСт Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Ρƒ процСсса Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π° запись Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ процСсс Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ запись Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ creat, Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π° запись Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ процСссам дозволяСтся ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠ², Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ€Π°Π½Π΅Π΅ Π½Π΅ сущСствовало Ρ„Π°ΠΉΠ»Π°, ядро Π½Π°Π·Π½Π°Ρ‡Π°Π΅Ρ‚ Π½ΠΎΠ²ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ индСкс, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ialloc (Ρ€Π°Π·Π΄Π΅Π» 4.6). Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ½ΠΎ записываСт имя Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΈ Π½ΠΎΠΌΠ΅Ρ€ вновь Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ индСкса Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π° смСщСниС Π² Π±Π°ΠΉΡ‚Π°Ρ… сохраняСт Π² пространствС процСсса. ВпослСдствии ядро освобоТдаСт индСкс Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ с Ρ‚ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΊΠΎΠ³Π΄Π° Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ производился поиск ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π°. Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ содСрТит имя Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΈ Π΅Π³ΠΎ индСкс. Π―Π΄Ρ€ΠΎ записываСт вновь Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ индСкс Π½Π° диск (Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ bwrite), ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π° диск ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ с Π½ΠΎΠ²Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ. Если ΠΌΠ΅ΠΆΠ΄Ρƒ опСрациями записи индСкса ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ сбой систСмы, Π² ΠΈΡ‚ΠΎΠ³Π΅ окаТСтся, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½ индСкс, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ссылаСтся Π½ΠΈ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΈΠΌΠ΅Π½ ΠΏΡƒΡ‚Π΅ΠΉ поиска Π² систСмС, ΠΎΠ΄Π½Π°ΠΊΠΎ систСма Π±ΡƒΠ΄Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ. Если, с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π±Ρ‹Π» записан Ρ€Π°Π½ΡŒΡˆΠ΅ вновь Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ индСкса ΠΈ сбой систСмы ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π» ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ, файловая систСма Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ имя ΠΏΡƒΡ‚ΠΈ поиска, ΡΡΡ‹Π»Π°ΡŽΡ‰Π΅Π΅ΡΡ Π½Π° Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΉ индСкс (Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎΠ± этом см. Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 5.16.1).