Таблица 3.2
| Цифра | Значение | Смысл |
|---|---|---|
| 1 | 0 | Никакие права пользователя не отвергнуты |
| 4 | Право пользователя на чтение отвергается | |
| 2 | Право пользователя на запись отвергается | |
| 1 | Право пользователя на выполнение отвергается | |
| 2 | 0 | Никакие права группы не отвергнуты |
| 4 | Право группы на чтение отвергается | |
| 2 | Право группы на запись отвергается | |
| 1 | Право группы на выполнение отвергается | |
| 3 | 0 | Никакие права остальных не отвергнуты |
| 4 | Право остальных на чтение отвергается | |
| 2 | Право остальных на запись отвергается | |
| 1 | Право остальных на выполнение отвергается |
Например, для блокирования права "группы" на запись и выполнение и права "остальных" на запись переменная umask должна была бы быть следующей (табл. 3.3).
Таблица 3.3
| Цифра | Значение |
|---|---|
| 1 | 0 |
| 2 | 2 |
| 1 | |
| 3 | 2 |
Значения каждой цифры объединяются операциями
OR2 | 13umaskКогда вы создаете файл с помощью системного вызова open или creat, параметр mode сравнивается с текущим значением переменной
umaskmodeumaskchmodchmodСистемный вызов
closefildes<b>#include <unistd.h></b><b>int close (int fildes);</b>В некоторых случаях проверка возвращаемого значения вызова
closeСистемный вызов
ioctlioctlioctl<b>#include <unistd.h></b><b>int ioctl(int fildes, int cmd, ...)</b>Вызов
ioctlcmdfildesНапример, следующий вызов
ioctlioctl(tty_fd, KDSETLED, LED_NUM|LED_CAP|LED_SCR);Выполните упражнения 3.1 и 3.2.
Теперь вы знаете достаточно о системных вызовах
openreadwriteВ данной главе мы проделаем это несколькими способами для того, чтобы сравнить эффективность разных методов. Для краткости предположим, что входной файл существует, а выходной — нет, и что все операции чтения и записи завершаются успешно. Конечно, в реальных программах вам придется убедиться в том, что эти предположения верны!
1. Сначала вам нужно создать тестовый входной файл размером, скажем, 1 Мбайт и именем file.in.
2. Далее откомпилируйте программу copy_system.c.
#include <unistd.h>#include <sys/stat.h>#include <fcntl.h>#include <stdlib.h>int main() { char c; int in, out; in = open("file.in", O_RDONLY); put = open("file.out", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR); while(read(in, &c, 1) == 1) write(out, &c, 1); exit(0);}Имейте в виду, что строка
#include <unistd.h>#include