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

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

Первый параметр задает файл, второй - выполняемую операцию, а третий - адрес структуры 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

mail

games

memo

test

f.c.

progi

/usr/jim

mail

games

memo

test

f.c.

note

progi

Рис. 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, то на время выполнения процесса идентификатор пользователя меняется на идентификатор владельца профаммы. Эта специальная возможность широко используется для того, чтобы позволить пользователям выполнять функции, доступные только суперпользователям, такие как создание директорий. А именно, для создания директории требуется



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.
Копирование материалов разрешено исключительно при условии цититирования.