Главная страница  Межпроцессное взаимодействие (состязание) 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 [ 178 ] 179 180 181 182 183 184 185 186 187

схожа, хотя do chown позволяет менять владельца файла только суперпользователю. Обычные пользователи вправе применять этот вызов, чтобы менять принадлежность их собственных файлов к группе.

Вызов umask позволяет задавать маску (хранящуюся в таблице процессов), которая маскирует биты разрещений при последующих вызовах creat. Весь код уместился бы в одну строку, если бы не потребность в восстановлении старого значения маски. Это дополнительное требование утраивает объем кода.

При помощи системного вызова access процесс может выяснить, разрещен ли ему определенный способ доступа к файлу (например, на чтение). Этот вызов реализуется функцией do access, которая считывает г-узел файла, а затем вызывает вспомогательную функцию, forbidden. Та, в свою очередь, проверяет UID и GID процесса, а также информацию в г-узле и в зависимости от этих данных принимает рещение о том, что доступ разрещен или запрещен.

Небольшая процедура read only проверяет файловую систему, на которой расположен переданный ей г-узел, и определяет, смонтирована ли она с доступом только на чтение. Эта функция необходима для предотвращения попыток записи на такую файловую систему.

Время

в MINIX есть несколько системных вызовов, манипулирующих временем, это utime, time, stime и times. Они представлены в табл. 5.9. Хотя три из четырех вызовов ничего не делают с файлами, они отнесены к файловой системе, поскольку информация о времени записывается в г-узлы файлов.

Таблица 5.9. Четыре системных вызова, связанных со временем Вызов Действие

utime Устанавливает время последнего изменения файла

time Устанавливает текущее реальное время в секундах

stime Устанавливает часы реального времени

times Запрашивает учетное время работы процесса

С каждым файлом связаны три 32-битных числа. Первые два из них хранят время последнего доступа к файлу и момент его последнего изменения. В третьем фиксируется время последнего изменения состояния самого г-узла. Это время будет меняться практически при каждом обращении к файлу, за исключением вызовов read и exec. Все значения хранятся в г-узле. При помощи системного вызова utime владелец файла или суперпользователь могут изменить время доступа и изменения. Это делается процедурой do utime из файла time.с, которая получает г-узел и записывает в него значения времени. Затем сбрасываются флаги, индицирующие, что требуется обновить время, с целью избежать дорогостоящего и ненужного здесь вызова clock time.

Файловая система не занимается поддержкой реального времени, это дело задачи часов в ядре. Следовательно, для файловой системы единственный способ узнать который час - послать сообщение ядру. Фактически, это именно то, что



делают обе функции do time и do stime. Реальное время измеряется в секундах, начиная с 1 января 1970 года.

Сведения о продолжительности работы процесса также хранятся в ядре. Каждый такт часов записывается на счет того или иного процесса. Чтобы получить эту информацию, нужно послать сообщение задаче системы, что и делает функция do tims. Она не названа do times потому, что многие компиляторы С добавляют знак подчеркивания перед каждым символом, а многие компоновщики усекают имена до восьми знакомест, в результате имя do time становится неотличимым от do times.

Все прочее

в файле misc.c размещен код системных вызовов, которые больше поместить было некуда. Вызов dup дублирует файловый дескриптор. Другими словами, он создает дескриптор, указывающий на тот же самый файл, что и аргумент вызова. У этого вызова есть вариант, называющийся dup2, и оба варианта выполняются процедурой do dup. Обе эти устаревшие процедуры включены в MINIX лишь для поддержки старых скомпилированных программ. В MINIX с современной версией библиотеки С их место занял системный вызов fcntl.

Таблица 5.10. Параметры вызова fcntl по стандарту POSIX

Операция Значение

F DUPFD Дублирует файловый дескриптор

F GETFD Получает значение флага закрыть при ехес

F SETFD Устанавливает значение флага закрыть при ехес

F GETFL Считывает флаги состояния

F SETFL Устанавливает флаги состояния

F GETLK Определяет владельца захваченного файла

F SETLK Устанавливает захват файла на чтение/запись

F SETLKW Устанавливает захват файла только на запись

Он и является рекомендуемым механизмом для работы с открытым файлом, а фактически выполняется функцией do fcntl. Задачи его самые разные, они определяются при помощи флагов POSIX, перечисленных в табл. 5.10. Этому вызову передается дескриптор файла, код операции и при необходимости дополнительные аргументы. Так, эквивалентом вызова

dup2(fd. fd2):

будет следующий вызов fcntl: fcntl(fd. F DUPFD. fd2):

Некоторые из запросов просто устанавливают или считывают флаг, их код занимает всего несколько строк. Например, запрос F SETFD устанавливает бит, означающий, что открытые файлы должны быть закрыты, когда пользователь вызовет ехес. При помощи запроса F GETFD можно определить текущее значение упомянутого бита. Запросы F SETFL и F GETFL позволяют устанавливать и считы-



вать флаги, индицирующие, доступен ли отдельный файл для работы в режиме без блокировки или для операций присоединения.

Кроме того, do fcntl обеспечивает захват файлов. Запросы F GETLK, F SETLK и F SETLKW транслируются в вызовы функции 1оск ор, которая обсуждалась ранее.

Следующий системный вызов, sync, копирует все модифицированные блоки и i-узлы на диск. Он выполняется функцией do sync, которая просто ищет в таблицах все измененные i-узлы и блоки. Причем сначала необходимо обрабатывать i-узлы, так как функция rwjnode помещает результат в кэщ блоков. После того как все модифицированные i-узлы перенесены в кэщ, все измененные блоки из кэша записываются на диск.

Системные вызовы fork, exec, exit и set в действительности относятся к менеджеру памяти, но результаты их работы передаются и сюда. Когда процесс создает потомка, важно, чтобы и ядро, и менеджер памяти, и файловая система об этом узнали. Чтобы передать нужные сведения, менеджер памяти вызывает перечисленные функции файловой системы. Функции dojork, do exit и do set заполняют таблицу процессов файловой системы соответствующей информацией, а do exec ищет и закрывает все открытые файлы, отмеченные битом закрыть при ехес . Эти системные вызовы не вызываются пользовательскими процессами напрямую, а только менеджером памяти.

Последняя функция в файле не является системным вызовом, хотя и обрабатывается как один из них. Это do revive. Она вызывается, когда закончила свою работу задача, у которой файловая система ранее запросила какие-то данные, например входные данные для пользовательского процесса. Тогда файловая система вновь запускает ранее приостановленный процесс и отправляет ему ответное сообщение.

5.7.7. Интерфейс устройств ввода/вывода

в MINIX ввод/вывод осуществляется путем передачи сообщений задачам в ядре. Интерфейс файловой системы для взаимодействия с задачами определен в файле device.c. Когда требуется произвести реальный ввод или вывод, для символьных специальных файлов функцию devjo вызывает read write, а для блочных ее вызывает rw block. Функция devJo строит стандартное сообщение и отправляет его нужной задаче. Вызов задачи происходит в строке:

(*dmap[major].dmap rw)(task. &dev mess):

Это выражение означает вызов функции, указатель на которую хранится в таблице dmess. Все соответствующие функции находятся здесь, в device.c. Когда devJo ждет ответа от задачи, система приостанавливает работу, поскольку внутренней многозадачности в MINIX нет. Но обычно это ожидание длится недолго (например, порядка 50 мс).

Специальные действия могут потребоваться, когда открывается или закрывается специальный файл. Что именно необходимо - зависит от типа устройства. Поэтому в таблице dmap указано, какую функцию вызывать для закрытия или



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 [ 178 ] 179 180 181 182 183 184 185 186 187

© 2000 - 2018 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования.