телям приходилось прибегать к услугам параллельно действующих процес-
133
сов для реализации механизма захвата путем вызова системных функций,
выполняющих элементарные действия. Какие из системных функций, описан-
ных в этой главе, могли бы использоваться ? Какие опасности подстере-
гают при использовании этих методов ?
12. Ричи заявлял (см. [Ritchie 81]), что захвата файла недостаточно для
того, чтобы предотвратить путаницу, вызываемую такими программами, как
редакторы, которые создают копию файла при редактировании и переписы-
вают первоначальный файл по окончании работы. Объясните, что он имел в
виду, и прокомментируйте.
13. Рассмотрим еще один способ блокировки файлов, предотвращающий разруши-
тельные последствия корректировки. Предположим, что в индексе содер-
жится новая установка прав доступа, позволяющая только одному процессу
в текущий момент открывать файл для записи и нескольким процессам отк-
рывать файл для чтения. Опишите реализацию этого способа.
+----------------------------------------------------------+
| main(argc,argv) |
| int argc; |
| char *argv[]; |
| { |
| if (argc != 2) |
| { |
| printf("введите: команда имя каталога\n"); |
| exit(); |
| } |
| |
| /* права доступа к каталогу: запись, чтение и ис- |
| полнение разрешены для всех */ |
| /* только суперпользователь может делать следую- |
| щее */ |
| if (mknod(argv[1],040777,0) == -1) |
| printf("mknod завершилась неудачно\n"); |
| } |
+----------------------------------------------------------+
Рисунок 5.37. Каталог, создание которого не завершено
*14. Рассмотрим программу (Рисунок 5.37), которая создает каталог с невер-
ным форматом (в каталоге отсутствуют записи с именами "." и "..").
Попробуйте, находясь в этом каталоге, выполнить несколько команд, та-
ких как ls -l, ls -ld, или cd. Что произойдет при этом ?
15. Напишите программу, которая выводит для файлов, имена которых указаны
в качестве параметров, информацию о владельце, типе файла, правах дос-
тупа и времени доступа. Если файл (параметр) является каталогом, прог-
рамма должна читать записи из каталога и выводить вышеуказанную инфор-
мацию для всех файлов в каталоге.
16. Предположим, что у пользователя есть разрешение на чтение из каталога,
но нет разрешения на исполнение. Что произойдет, если каталог исполь-
зовать в качестве параметра команды ls, заданной с опцией "-i" ? Что
будет, если указана опция "-l" ? Поясните свои ответы. Ответьте на
вопрос, сформулированный для случая, когда есть разрешение на исполне-
ние, но нет разрешения на чтение из каталога.
17. Сравните права доступа, которые должны быть у процесса для выполнения
следующих действий, и прокомментируйте:
* Для создания нового файла требуется разрешение на запись в каталог.
* Для "создания" существующего файла требуется разрешение на запись в
файл.
* Для удаления связи файла с каталогом требуется разрешение на запись
134
в каталог, а не в файл.
*18. Напишите программу, которая навещает все каталоги, начиная с текущего.
Как она должна управлять циклами в иерархии каталогов ?
19. Выполните программу, приведенную на Рисунке 5.38, и объясните, что при
этом происходит в ядре. (Намек: выполните команду pwd, когда программа
закончится).
20. Напишите программу, которая заменяет корневой каталог указанным ката-
логом, и исследуйте дерево каталогов, доступное для этой программы.
21. Почему процесс не может отменить предыдущий вызов функции chroot ? Из-
мените конкретную реализацию процесса таким образом, чтобы он мог ме-
нять текущее значение корня на предыдущее. Какие у этой возможности
преимущества и неудобства ?
22. Рассмотрим простой пример канала (Рисунок 5.19), когда процесс записы-
вает в канал строку "hello" и затем считывает
+----------------------------------------------------------+
| main(argc,argv) |
| int argc; |
| char *argv[]; |
| { |
| if (argc != 2) |
| { |
| printf("нужен 1 аргумент - имя каталога\n"); |
| exit(); |
| } |
| |
| if (chdir(argv[1]) == -1) |
| printf("%s файл не является каталогом\n",argv[1]);|
| } |
+----------------------------------------------------------+
Рисунок 5.38. Пример программы с использованием функции chdir
ее. Что произошло бы, если бы массив для записи данных в канал имел
размер 1024 байта вместо 6 (а объем считываемых за одну операцию дан-
ных оставался равным 6) ? Что произойдет, если порядок вызова функций
read и write в программе изменить, поменяв функции местами ?
23. Что произойдет при выполнении программы, иллюстрирующей использование
поименованных каналов (Рисунок 5.19), если функция mknod обнаружит,
что канал с таким именем уже существует ? Как этот момент реализуется
ядром ? Что произошло бы, если бы вместо подразумеваемых в тексте
программы одного считывающего и одного записывающего процессов связь
между собой через канал попытались установить несколько считывающих и
записывающих процессов ? Как в этом случае гарантировалась бы связь
одного считывающего процесса с одним записывающим процессом ?
24. Открывая поименованный канал для чтения, процесс приостанавливается до
тех пор, пока еще один процесс не откроет канал для записи. Почему ?
Не мог бы процесс успешно пройти функцию open, продолжить работу до
того момента, когда им будет предпринята попытка чтения данных из ка-
нала, и приостановиться при выполнении функции read ?
25. Как бы вы реализовали алгоритм выполнения системной функции dup2 (из
версии 7), вызываемой следующим образом: dup2(oldfd,newfd);
где oldfd - файловый дескриптор, который дублируется дескриптором
newfd ? Что произошло бы, если бы дескриптор newfd уже принадлежал от-
крытому файлу?
*26. Какие последствия имело бы решение ядра позволить двум процессам од-
новременно смонтировать одну и ту же файловую систему в двух точках
монтирования ?
135
27. Предположим, что один процесс меняет свой текущий каталог на каталог
"/mnt/a/b/c", после чего другой процесс в каталоге "/mnt" монтирует
файловую систему. Завершится ли функция mount успешно ? Что произой-
дет, если первый процесс выполнит команду pwd ? Ядро не позволит функ-
ции mount успешно завершиться, если значение счетчика ссылок в индексе
каталога "/mnt" превышает 1. Прокомментируйте этот момент.
28. При исполнении алгоритма пересечения точки монтирования по имени ".."
в маршруте поиска файла ядро проверяет выполнение трех условий, свя-
занных с точкой монтирования: что номер обнаруженного индекса совпада-
ет с номером корневого индекса, что рабочий индекс является корнем
файловой системы и что имя компоненты маршрута поиска - "..". Почему
необходимо проверять выполнение всех трех условий ? Докажите, что про-
верки любых двух условий недостаточно для того, чтобы разрешить про-
цессу пересечь точку монтирования.
29. Если пользователь монтирует файловую систему только для чтения, ядро
устанавливает соответствующий флаг в суперблоке. Как ядро может восп-
репятствовать выполнению операций записи в функциях write, creat,
link, unlink, chown и chmod ? Какого рода информацию записывают в фай-
ловую систему все перечисленные функции ?
*30. Предположим, что один процесс пытается демонтировать файловую систему,
в то время как другой процесс пытается создать в файловой системе но-
вый файл. Только одна из функций umount и creat выполнится успешно.
Подробно рассмотрите возникшую конкуренцию.
*31. Когда функция umount проверяет отсутствие в файловой системе активных
файлов, возникает одна проблема, связанная с тем, что корневой индекс
файловой системы, назначаемый при выполнении функции mount с помощью
алгоритма iget, имеет счетчик ссылок с положительным значением. Как
функция umount сможет убедиться в отсутствии активных файлов и отчи-
таться перед корнем файловой системы ? Рассмотрите два случая:
* функция umount освобождает корневой индекс по алгоритму iput перед
проверкой активных индексов. (Как функции вернуть этот индекс обрат-
но, если будут обнаружены активные файлы ?)
* функция umount проверяет отсутствие активных файлов до того, как ос-
вободить корневой индекс, и разрешая корневому индексу оставаться
активным. (Насколько активным может быть корневой индекс ?)
32. Обратите внимание на то, что при выполнении команды ls -ld количество
связей с каталогом никогда не равно 1. Почему ?
33. Как работает команда mkdir (создать новый каталог) ? (Наводящий воп-
рос: какие номера по завершении выполнения команды имеют индексы для
файлов "." и ".." ?)
*34. Понятие "символические связи" имеет отношение к возможности указания с
помощью функции link связей между файлами, принадлежащими к различным
файловым системам. С файлом символической связи ассоциирован указатель
нового типа; содержимым файла является имя пути поиска того файла, с
которым он связан. Опишите реализацию символических связей.
*35. Что произойдет, если процесс вызовет функцию unlink(".");
Каким будет текущий каталог процесса ? Предполагается, что процесс об-
ладает правами суперпользователя.
36. Разработайте системную функцию, которая усекает существующий файл до
произвольных размеров, указанных в качестве аргумента, и опишите ее
работу. Реализуйте системную функцию, которая позволяла бы пользовате-
лю удалять сегмент файла, расположенный между двумя адресами, заданны-
ми в виде смещений, и сжимать файл. Напишите программу, которая не вы-
зывала бы эти функции, но обладала бы теми же функциональными возмож-
ностями.
37. Опишите все условия, при которых счетчик ссылок в индексе может превы-
шать значение 1.
38. Затрагивая тему абстрактных обращений к файловым системам, ответьте на
вопрос: следует ли файловой системе каждого типа иметь личную операцию
блокирования, вызываемую из общей программы, или же достаточно общей
операции блокирования ?
136
133
сов для реализации механизма захвата путем вызова системных функций,
выполняющих элементарные действия. Какие из системных функций, описан-
ных в этой главе, могли бы использоваться ? Какие опасности подстере-
гают при использовании этих методов ?
12. Ричи заявлял (см. [Ritchie 81]), что захвата файла недостаточно для
того, чтобы предотвратить путаницу, вызываемую такими программами, как
редакторы, которые создают копию файла при редактировании и переписы-
вают первоначальный файл по окончании работы. Объясните, что он имел в
виду, и прокомментируйте.
13. Рассмотрим еще один способ блокировки файлов, предотвращающий разруши-
тельные последствия корректировки. Предположим, что в индексе содер-
жится новая установка прав доступа, позволяющая только одному процессу
в текущий момент открывать файл для записи и нескольким процессам отк-
рывать файл для чтения. Опишите реализацию этого способа.
+----------------------------------------------------------+
| main(argc,argv) |
| int argc; |
| char *argv[]; |
| { |
| if (argc != 2) |
| { |
| printf("введите: команда имя каталога\n"); |
| exit(); |
| } |
| |
| /* права доступа к каталогу: запись, чтение и ис- |
| полнение разрешены для всех */ |
| /* только суперпользователь может делать следую- |
| щее */ |
| if (mknod(argv[1],040777,0) == -1) |
| printf("mknod завершилась неудачно\n"); |
| } |
+----------------------------------------------------------+
Рисунок 5.37. Каталог, создание которого не завершено
*14. Рассмотрим программу (Рисунок 5.37), которая создает каталог с невер-
ным форматом (в каталоге отсутствуют записи с именами "." и "..").
Попробуйте, находясь в этом каталоге, выполнить несколько команд, та-
ких как ls -l, ls -ld, или cd. Что произойдет при этом ?
15. Напишите программу, которая выводит для файлов, имена которых указаны
в качестве параметров, информацию о владельце, типе файла, правах дос-
тупа и времени доступа. Если файл (параметр) является каталогом, прог-
рамма должна читать записи из каталога и выводить вышеуказанную инфор-
мацию для всех файлов в каталоге.
16. Предположим, что у пользователя есть разрешение на чтение из каталога,
но нет разрешения на исполнение. Что произойдет, если каталог исполь-
зовать в качестве параметра команды ls, заданной с опцией "-i" ? Что
будет, если указана опция "-l" ? Поясните свои ответы. Ответьте на
вопрос, сформулированный для случая, когда есть разрешение на исполне-
ние, но нет разрешения на чтение из каталога.
17. Сравните права доступа, которые должны быть у процесса для выполнения
следующих действий, и прокомментируйте:
* Для создания нового файла требуется разрешение на запись в каталог.
* Для "создания" существующего файла требуется разрешение на запись в
файл.
* Для удаления связи файла с каталогом требуется разрешение на запись
134
в каталог, а не в файл.
*18. Напишите программу, которая навещает все каталоги, начиная с текущего.
Как она должна управлять циклами в иерархии каталогов ?
19. Выполните программу, приведенную на Рисунке 5.38, и объясните, что при
этом происходит в ядре. (Намек: выполните команду pwd, когда программа
закончится).
20. Напишите программу, которая заменяет корневой каталог указанным ката-
логом, и исследуйте дерево каталогов, доступное для этой программы.
21. Почему процесс не может отменить предыдущий вызов функции chroot ? Из-
мените конкретную реализацию процесса таким образом, чтобы он мог ме-
нять текущее значение корня на предыдущее. Какие у этой возможности
преимущества и неудобства ?
22. Рассмотрим простой пример канала (Рисунок 5.19), когда процесс записы-
вает в канал строку "hello" и затем считывает
+----------------------------------------------------------+
| main(argc,argv) |
| int argc; |
| char *argv[]; |
| { |
| if (argc != 2) |
| { |
| printf("нужен 1 аргумент - имя каталога\n"); |
| exit(); |
| } |
| |
| if (chdir(argv[1]) == -1) |
| printf("%s файл не является каталогом\n",argv[1]);|
| } |
+----------------------------------------------------------+
Рисунок 5.38. Пример программы с использованием функции chdir
ее. Что произошло бы, если бы массив для записи данных в канал имел
размер 1024 байта вместо 6 (а объем считываемых за одну операцию дан-
ных оставался равным 6) ? Что произойдет, если порядок вызова функций
read и write в программе изменить, поменяв функции местами ?
23. Что произойдет при выполнении программы, иллюстрирующей использование
поименованных каналов (Рисунок 5.19), если функция mknod обнаружит,
что канал с таким именем уже существует ? Как этот момент реализуется
ядром ? Что произошло бы, если бы вместо подразумеваемых в тексте
программы одного считывающего и одного записывающего процессов связь
между собой через канал попытались установить несколько считывающих и
записывающих процессов ? Как в этом случае гарантировалась бы связь
одного считывающего процесса с одним записывающим процессом ?
24. Открывая поименованный канал для чтения, процесс приостанавливается до
тех пор, пока еще один процесс не откроет канал для записи. Почему ?
Не мог бы процесс успешно пройти функцию open, продолжить работу до
того момента, когда им будет предпринята попытка чтения данных из ка-
нала, и приостановиться при выполнении функции read ?
25. Как бы вы реализовали алгоритм выполнения системной функции dup2 (из
версии 7), вызываемой следующим образом: dup2(oldfd,newfd);
где oldfd - файловый дескриптор, который дублируется дескриптором
newfd ? Что произошло бы, если бы дескриптор newfd уже принадлежал от-
крытому файлу?
*26. Какие последствия имело бы решение ядра позволить двум процессам од-
новременно смонтировать одну и ту же файловую систему в двух точках
монтирования ?
135
27. Предположим, что один процесс меняет свой текущий каталог на каталог
"/mnt/a/b/c", после чего другой процесс в каталоге "/mnt" монтирует
файловую систему. Завершится ли функция mount успешно ? Что произой-
дет, если первый процесс выполнит команду pwd ? Ядро не позволит функ-
ции mount успешно завершиться, если значение счетчика ссылок в индексе
каталога "/mnt" превышает 1. Прокомментируйте этот момент.
28. При исполнении алгоритма пересечения точки монтирования по имени ".."
в маршруте поиска файла ядро проверяет выполнение трех условий, свя-
занных с точкой монтирования: что номер обнаруженного индекса совпада-
ет с номером корневого индекса, что рабочий индекс является корнем
файловой системы и что имя компоненты маршрута поиска - "..". Почему
необходимо проверять выполнение всех трех условий ? Докажите, что про-
верки любых двух условий недостаточно для того, чтобы разрешить про-
цессу пересечь точку монтирования.
29. Если пользователь монтирует файловую систему только для чтения, ядро
устанавливает соответствующий флаг в суперблоке. Как ядро может восп-
репятствовать выполнению операций записи в функциях write, creat,
link, unlink, chown и chmod ? Какого рода информацию записывают в фай-
ловую систему все перечисленные функции ?
*30. Предположим, что один процесс пытается демонтировать файловую систему,
в то время как другой процесс пытается создать в файловой системе но-
вый файл. Только одна из функций umount и creat выполнится успешно.
Подробно рассмотрите возникшую конкуренцию.
*31. Когда функция umount проверяет отсутствие в файловой системе активных
файлов, возникает одна проблема, связанная с тем, что корневой индекс
файловой системы, назначаемый при выполнении функции mount с помощью
алгоритма iget, имеет счетчик ссылок с положительным значением. Как
функция umount сможет убедиться в отсутствии активных файлов и отчи-
таться перед корнем файловой системы ? Рассмотрите два случая:
* функция umount освобождает корневой индекс по алгоритму iput перед
проверкой активных индексов. (Как функции вернуть этот индекс обрат-
но, если будут обнаружены активные файлы ?)
* функция umount проверяет отсутствие активных файлов до того, как ос-
вободить корневой индекс, и разрешая корневому индексу оставаться
активным. (Насколько активным может быть корневой индекс ?)
32. Обратите внимание на то, что при выполнении команды ls -ld количество
связей с каталогом никогда не равно 1. Почему ?
33. Как работает команда mkdir (создать новый каталог) ? (Наводящий воп-
рос: какие номера по завершении выполнения команды имеют индексы для
файлов "." и ".." ?)
*34. Понятие "символические связи" имеет отношение к возможности указания с
помощью функции link связей между файлами, принадлежащими к различным
файловым системам. С файлом символической связи ассоциирован указатель
нового типа; содержимым файла является имя пути поиска того файла, с
которым он связан. Опишите реализацию символических связей.
*35. Что произойдет, если процесс вызовет функцию unlink(".");
Каким будет текущий каталог процесса ? Предполагается, что процесс об-
ладает правами суперпользователя.
36. Разработайте системную функцию, которая усекает существующий файл до
произвольных размеров, указанных в качестве аргумента, и опишите ее
работу. Реализуйте системную функцию, которая позволяла бы пользовате-
лю удалять сегмент файла, расположенный между двумя адресами, заданны-
ми в виде смещений, и сжимать файл. Напишите программу, которая не вы-
зывала бы эти функции, но обладала бы теми же функциональными возмож-
ностями.
37. Опишите все условия, при которых счетчик ссылок в индексе может превы-
шать значение 1.
38. Затрагивая тему абстрактных обращений к файловым системам, ответьте на
вопрос: следует ли файловой системе каждого типа иметь личную операцию
блокирования, вызываемую из общей программы, или же достаточно общей
операции блокирования ?
136