| Цифра | Значение | Смысл |
|---|---|---|
| 1 | 0 | Никакие права пользователя не отвергнуты |
| 4 | Право пользователя на чтение отвергается | |
| 2 | Право пользователя на запись отвергается | |
| 1 | Право пользователя на выполнение отвергается | |
| 2 | 0 | Никакие права группы не отвергнуты |
| 4 | Право группы на чтение отвергается | |
| 2 | Право группы на запись отвергается | |
| 1 | Право группы на выполнение отвергается | |
| 3 | 0 | Никакие права остальных не отвергнуты |
| 4 | Право остальных на чтение отвергается | |
| 2 | Право остальных на запись отвергается | |
| 1 | Право остальных на выполнение отвергается |
Например, для блокирования права "группы" на запись и выполнение и права "остальных" на запись переменная umask должна была бы быть следующей (табл. 3.3).
| Цифра | Значение |
|---|---|
| 1 | 0 |
| 2 | 2 |
| 1 | |
| 3 | 2 |
Значения каждой цифры объединяются операциями OR
2 | 1, дающая в результате 3. Результирующее значение umask — 032.Когда вы создаете файл с помощью системного вызова open или creat, параметр mode сравнивается с текущим значением переменной umask
mode и одновременно в переменной umask, удаляется. В результате пользователи могут настроить свое окружение, например, потребовав не создавать никаких файлов с правом на запись для остальных, даже если программа, создающая файл, требует предоставить такое право. Это не мешает программе или пользователю впоследствии применить команду chmod (или системный вызов chmod в программе), чтобы добавить право на запись для остальных, но поможет защитить пользователей, избавив их от необходимости проверять и задавать права доступа для всех новых файлов.Системный вызов close
fildes с его файлом. Дескриптор файла после этого может использоваться повторно. Вызов возвращает 0 в случае успешного завершения и -1 при возникновении ошибки.#include
int close (int fildes);
В некоторых случаях проверка возвращаемого значения вызова close
Системный вызов ioctl
ioctl и вам необходимо обращаться за подробной информацией к страницам справочного руководства, относящимся к конкретным устройствам. В стандарте POSIX определены только вызовы ioctl для потоков, которые не обсуждаются в этой книге. Далее приведена синтаксическая запись вызова.#include
int ioctl(int fildes, int cmd, ...)
Вызов ioctl
cmd, над объектом, заданным в дескрипторе fildes. У вызова может быть необязательный третий аргумент, зависящий от функций, поддерживаемых конкретным устройством.Например, следующий вызов ioctl
ioctl(tty_fd, KDSETLED, LED_NUM|LED_CAP|LED_SCR);
Выполните упражнения 3.1 и 3.2.
Теперь вы знаете достаточно о системных вызовах open
read и write, чтобы написать простенькую программу copy_system.c для посимвольного копирования одного файла в другой.В данной главе мы проделаем это несколькими способами для того, чтобы сравнить эффективность разных методов. Для краткости предположим, что входной файл существует, а выходной — нет, и что все операции чтения и записи завершаются успешно. Конечно, в реальных программах вам придется убедиться в том, что эти предположения верны!
1. Сначала вам нужно создать тестовый входной файл размером, скажем, 1 Мбайт и именем file.in.
2. Далее откомпилируйте программу copy_system.c.
#include
#include
#include
#include
int main {
char c;