- •Введение
- •Лабораторная работа 1.
- •Регистрация пользователя в системе
- •Выход из системы
- •Выполнение простых команд
- •Группирование команд
- •Задание для самостоятельной работы
- •Контрольные вопросы
- •Задание для самостоятельной работы
- •Контрольные вопросы
- •Задание для самостоятельной работы
- •Контрольные вопросы
- •Задание для самостоятельной работы
- •Контрольные вопросы
- •Литература
- •5.3. Задание для самостоятельной работы
- •5.4. Контрольные вопросы
- •Задание для самостоятельной работы
- •Контрольные вопросы
- •Задание для самостоятельной работы
- •Формат файла /etc/passwd
- •Формат файла /etc/shadow
- •Формат файла /etc/group
- •Создание нового пользователя
- •Переключение между пользователями
- •Файлы инициализации пользователей
- •Файлы, регламентирующие работу пользователей
- •Задания для самостоятельной работы
- •Контрольные вопросы
- •9.3. Права доступа к каталогам
- •9.4. Смена прав доступа на файлы
- •9.5. Маска на вновь создаваемые файлы
- •9.6. Дополнительные атрибуты файла
- •9.7. Списки управления доступом
- •Задания для самостоятельной работы
- •Контрольные вопросы
- •10.3. Метасимволы или шаблоны
- •10.4. История команд
- •10.5. Псевдонимы
- •10.6. Перенаправление ввода и вывода
- •10.7. Конвейеры
- •10.8. Приглашение ко вводу
- •10.9. Сценарии оболочки
- •10.10. Задания для самостоятельной работы
- •10.11. Контрольные вопросы
- •11.3. Системный вызов open()
- •11.4. Системный вызов read()
- •11.5. Системный вызов write()
- •11.6. Системный вызов lseek()
- •11.7. Системный вызов close()
- •11.8. Задания для самостоятельной работы
- •11.9. Контрольные вопросы
- •12.3. Системный вызов fork
- •12.4. Системный вызов exit
- •12.5. Системный вызов wait
- •12.6. Системный вызов exec
- •12.7. Системные вызовы наследования пользовательских дескрипторов файла
- •12.8. Задания для самостоятельной работы
- •12.9. Контрольные вопросы
- •13.3. Системный вызов signal
- •13.4. Системный вызов pause
- •13.5. Системный вызов alarm
- •13.6. Управление непредусмотренными событиями
- •13.7. Неименованные каналы
- •13.8. Именованные каналы
- •13.9. Задания для самостоятельной работы
- •13.10. Контрольные вопросы
- •Литература
- •Заключение
- •Учебное издание
- •Системное программирование Лабораторный практикум
11.3. Системный вызов open()
Системный вызов open() позволяет открыть или создать файл для чтения или записи. Синтаксис системного вызова следующий: int open (char* fileName, int mode [, int permissions]), где fileName – абсолютное или относительное имя пути, mode – поразрядное OR флага чтения/записи, с учетом или без учета некоторых смешанных флагов, permissions – число, которое кодирует значения флагов доступа к файлу, необходимо только, когда файл создается. Значения предопределенного флага чтения/записи и смешанных флагов заданы в файле /usr/include/fcntl.h.Флаги чтения/записи представлены в таблице 11.2. Смешанные флаги представлены в таблице 11.3.
Таблица 11.2
Флаги чтения/записи
Флаг |
Описание |
O_RDONLY |
Открывает только для чтения |
O_WRONLY |
Открывает только для записи |
O_RDWR |
Открывает для чтения и записи |
Таблица 11.3
Смешанные флаги
Флаг |
Описание |
O_APPEND |
Позиция указателя в конце файла перед каждым write() |
O_CREAT |
Если файл не существует, создает его и устанавливает ID владельца на эффективный UID процесса. Значение umask используется при определении начальных значений флага доступа |
O_EXCL |
Если O_CREAT установлен и файл существует, тогда open() завершается с ошибкой |
O_TRUNC |
Если файл существует, он усекается до нулевой длины, open() возвращает неотрицательный дескриптор файла, если завершится успешно, иначе возвращается -1 |
Пример. Создание файла. Чтобы создать файл, используйте флаг O_CREAT в параметре mode и добавьте восьмеричное значение для начальной установки флага. Следующие строки создают временный файл с доступом на чтение и запись для владельца и затем открывают файл для чтения и записи:
sprintf ( tmpName, “.rev.%d”, getpid()); /* Случайное имя */
/* Создать временный файл для хранения копии ввода */
tmpfd = open (tmpName, O_CREAT | O_RDWR , 0600);
if (tmpfd = = -1) fatalError();
Функция getpid() является системным вызовом, который возвращает ID процесса (PID) – номер, который будет уникальным. Это удобный способ сформировать уникальное временное имя файла. Обратите внимание, что имя временного файла начинается с точки так, чтобы оно не появлялось в листинге утилиты ls. Файлы, которые начинаются с точки, называют скрытыми файлами.
Пример. Открытие существующего файла. Чтобы открыть существующий файл, задайте флаги параметра mode. Следующие строки демонстрируют открытие файла в режиме только для чтения:
fd = open (fileName, O_RDONLY);
if (fd = = -1) fatalError();
11.4. Системный вызов read()
Системный вызов read() позволяет читать информацию из файла. Преимущество read() состоит в том, что он обходит дополнительный этап буферирования, обеспечиваемый библиотечными функциями С, и поэтому является очень быстрым. Синтаксис системного вызова следующий: ssize_t read (int fd, void* buf, size_t count). Системный вызов read() копирует count байтов из файла, заданного дескриптором файла fd в буфер buf . Байты читаются, начиная с текущей позиции файлового указателя, который затем обновляется. Если read() предпринимается после того, как последний байт уже считался, он возвращает 0, который указывает на конец файла. Если системный вызов завершился успешно, read() возвращает количество прочитанных байтов, иначе возвращает -1.
Пример. Чтение файла. Следующие строки демонстрируют чтение файла:
charsRead = read (fd, buffer, BUFFER_SIZE);
if (charsRead = = 0) break; /* EOF */
if (charsRead = = -1) fatalError(); /* Ошибка */