Главная страница Межпроцессное взаимодействие (состязание) Первый параметр задает файл, второй - выполняемую операцию, а третий - адрес структуры POSIX, содержащей флаги и массив управляющих символов. Другие коды операций позволяют отложить изменения до завершения вывода, считать текущие значения параметров и отбросить не до конца считанные данные. Системный вызов access позволяет узнать, разрешено ли системой офаничения доступа обращение к определенному файлу. Этот вызов необходим потому, что некоторые программы могут работать под другим идентификатором пользователя. Для этого профаммами используется механизм setuid, который будет описан далее. Чтобы присвоить файлу новое имя, применяется системный вызов rename. Его параметры задают старое и новое имя файла. Наконец, для управления файлами служит вызов fcntl, в чем-то подобный вызову ioctl (иными словами, оба этих вызова - фязный хак). У этого вызова есть несколько параметров, самые важные из которых служат для управления захватом файла. С помощью fcntl можно захватьшать и освобождать отдельные части файлов, а также определять, захвачен ли нужный участок. Этот вызов никак не определяет семантику захвата файла. Профаммы должны сами решать, что делать. 1.4.4. Системные вызовы для управления каталогами в этом разделе мы рассмотрим некоторые системные вызовы, относящиеся скорее к каталогам и файловой системе в целом, нежели просто к определенному файлу, как в предыдущем разделе. Первые два вызова, mkdi г и rmdi г, соответственно создают и удаляют пустые каталоги. Следующий вызов - link. Он разрешает одному файлу появляться под двумя или более именами, часто в разных каталогах. Этот вызов обычно используется, когда несколько программистов, работающих в одной команде, должны совместно использовать один общий файл. Тогда этот файл может появиться в каталоге у каждого из программистов, возможно, под другим именем. Разделение (совместное использование) файла - это не то же самое, что копирование файла для каждого члена команды. При разделении файла изменения, производимые одним профаммистом, немедленно становятся видимыми для остальных - все происходит в одном файле. А при создании копии файла последующие изменения не влияют на другие копии этого файла. Чтобы увидеть, как работает вызов link, рассмотрим ситуацию на рис. 1.10, а. Два пользователя, ast njim, имеют свои собственные каталоги ast и jim с файлами. Если теперь пользователь ast запустит программу, содержащую системный вызов link( /usr/jim/memo . /usr/ast/note ): то файл memo в каталоге Джима появится в каталоге Аста под названием note. Соответственно, /usr/jim/memo и /usr/ast/note теперь будут ссылаться на один и тот же файл. Хранятся ли каталоги пользователей в каталоге /usr, /user, /home или где-либо еще, определяется локальным системным администратором. Возможно, станет понятнее, что делает системный вызов 1 ink, если разобраться в том, как он работает. Каждый файл в MINIX имеет уникальный номер - свой i-номер, который идентифицирует файл (identification - идентификация). i-номер - это индекс в таблице i-узлов (i-nodes), содержащей по одному идентификатору на файл. Каждый i-узел включает в себя информацию о хозяине файла, о том, какие блоки на диске он занимает и т. д. Каталог представляет собой просто файл, содержащий набор пар (1-номер, ASCII-имя). На рис. 1.10, 5 два элемента имеют одинаковый i-номер (70) и, таким образом, ссылаются на один и тот же файл. Если впоследствии один из них будет удален с помощью системного вызова unlink, другой элемент останется. Если будут удалены оба файла, MINIX увидит, что больше нет записей, соответствующих этому файлу (поле в таблице i-узлов хранит данные с номером элемента каталога, указывающие на файл), и удалит файл с диска. /usr/ast /usr/jim /usr/ast
/usr/jim
Рис. 1.10. a - два каталога до присоединения /usr/jim/memo к каталогу ast; б - те же каталоги после вызова link Как упоминалось выше, системный вызов mount позволяет объединять в одну две файловых системы. Обычная ситуация такова: на жестком диске находится корневая файловая система, содержащая двоичные (исполняемые) версии общих команд и наиболее часто использующиеся файлы. При этом пользователь может вставить в дисковод гибкий диск для чтения файлов. При помощи системного вызова mount файловую систему с гибкого диска можно присоединить к корневой файловой системе, как показано на рис. 1.11. Типичный оператор на языке С, выполняющий монтирование, выглядит так: mount( /dev/fdO . /mnt . 0): где первым параметром является имя специального блочного файла на диске О, второй параметр - это место в дереве, куда будет вмонтирована файловая система, а третий параметр говорит о том, монтируется ли встроенная файловая система для чтения и записи или только для чтения. bin dev о lib mnt usr Рис. 1.11. Файловая система: а - до вызова mount; б - после вызова mount После вызова mount доступ к файлу на диске О можно получить, просто указав его путь из корневого или рабочего каталога, независимо от того, на каком диске он находится. В действительности второй, третий и четвертый диски тоже можно встроить в любое удобное место в дереве. Вызов mount позволяет объединить съемные носители в единую интегрированную файловую структуру, не заботясь о том, на каком из устройств фактически находится файл. Хотя в нашем примере рассматривались гибкие диски, жесткие диски или их части (часто называемые разделами (partition) или младшими устройствами (minor devices)) монтируются аналогично. Когда файловая система более не нужна, ее можно демонтировать с помощью системного вызова umount. MINIX кэширует в памяти последние блоки, к которым были совершены обращения, чтобы избежать слишком частых обращений к диску. Если блок в памяти модифицирован (например, вызовом write) и система рухнет до того, как обновленный блок будет записан на диск, файловая система будет повреждена. Чтобы уменьшить возможный риск повреждения, важно периодически сбрасывать содержимое кэша на диск, чтобы в случае сбоя системы терялось только небольшое количество данных. Системный вызов sync указывает MINIX сбросить на диск кэшированные блоки. Обычно при старте MINIX вместе с системой запускается фоновая программа update, каждые 30 секунд вызывающая sync. Для работы с директориями служат еще два вызова, chdi г и chroot. Первый из них меняет текущую директорию, а второй меняет корневую. После вызова chdir( /usr/ast/test ): процедура открытия файла xyz откроет /usr/ast/test/xyz. Использование понятия рабочего каталога избавляет от необходимости постоянно набирать длинные абсолютные пути файлов. 1.4.5. Системные вызовы для защиты в MINIX для каждого файла определен 11 -битный режимный код файла, иногда также называемый модой (mode), используемый для его защиты. Режимный код включает в себя 9 бит чтения-записи-выполнения для владельцев, фуппы и других пользователей. Системный вызов chmod предоставляет возможность изменения режимного кода файла. Например, следующий вызов предоставит всем, кроме владельца, доступ к файлу только для чтения; владелец же сможет еще и выполнять файл: chmodCfile . 0644): Другие два бита зашиты, 02000 и 04000, называются соответственно битами SETGID (set-group-id, устанавливать идентификатор фуппы) и SETUID (set-user-id, устанавливать идентификатор пользователя). Когда пользователь запускает профамму, у которой установлен бит SETUID, то на время выполнения процесса идентификатор пользователя меняется на идентификатор владельца профаммы. Эта специальная возможность широко используется для того, чтобы позволить пользователям выполнять функции, доступные только суперпользователям, такие как создание директорий. А именно, для создания директории требуется
|
© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования. |