Главная страница Межпроцессное взаимодействие (состязание) схожа, хотя 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 указано, какую функцию вызывать для закрытия или
|
© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования. |