- •Введение
- •Глава 1. Фундаментальные концепции unix Систем
- •Программы, процессы и потоки
- •Сигналы
- •Идентификаторы процессов, группы процессов и сеансы
- •Система прав
- •Другие атрибуты процесса
- •Межпроцессное взаимодействие
- •Использование системных вызовов
- •Краткие описания функций и обработка ошибок
- •Контрольные вопросы
- •Литература
- •Глава 2. Базовые операции ввода-вывода
- •Файловые операции ввода - вывода
- •Стандартные дескрипторы
- •Системные вызовы open и creat
- •Системный вызов umask
- •Системный вызов unlink
- •Текущая позиция в файле
- •Системный вызов write
- •2.8. Системный вызов read
- •2.9. Системный вызов close
- •2.10. Системный вызов lseek
- •2.11. Системные вызовы pread и pwrite
- •2.12. Системные вызовы truncate и ftruncate
- •Контрольные вопросы
- •Литература
- •Глава 3. Дополнительные операции файлового ввода_вывода
- •Низкоуровневый доступ к файловой системе
- •Жесткие и символические ссылки
- •Системный вызов getcwd
- •Отображение метаданных файла
- •Системные вызовы getpwuid, getgrgid и getlogin
- •Каталоги
- •Системные вызовы chdir и fchdir
- •Системные вызовы mkdir и rmdir
- •Контрольные вопросы
- •Литература
- •Глава 4. Процессы и потоки
- •4.1. Среда окружения
- •Системный вызов exec
- •Системный вызов fork
- •Завершение процесса и системные вызовы exit
- •Системные вызовы wait, waitpid и waitid
- •Получение и изменение идентификаторов пользователя и группы
- •Получение и изменение приоритета
- •Контрольные вопросы
- •Литература
- •Глава 5. Механизмы межпроцессного взаимодействия
- •5.1. Каналы
- •5.2. Системные вызовы dup и dup2
- •5.3. Двунаправленное взаимодействие с использованием однонаправленных каналов
- •Контрольные вопросы
- •Литература
- •Глава 6.Механизмы взаимодействия процессов
- •Именованные каналы (fifo)
- •Системные вызовы для работы с очередями сообщений posix
- •Семафоры
- •Системные вызовы для работы с общей памятью posix
- •Контрольные вопросы
- •Литература
- •Глава 7.Сетевое взаимодействие и сокеты
- •Основные системные вызовы для работы с сокетами, образующими логические соединения
- •Обслуживание нескольких клиентов
- •Адресация сокетов
- •In_port_t sin_port; /* номер порта (uint16_t) */
- •In_addr_t s_addr; /* адрес iPv4 (uint32_t) */
- •Домен адресов af_inet6
- •In_port_t sin6_port; /* номер порта (uint16_t) */
- •Доменная система именования
- •Параметры сокетов
- •Контрольные вопросы
- •Литература
- •Глава 8.Сигналы и таймеры
- •Введение в сигналы
- •Жизненный цикл сигналов
- •Типы сигналов
- •Системный вызов sigaction
- •Контрольные вопросы
- •Литература
- •Заключение
- •Список литературы
- •Глава 2. Базовые операции ввода-вывода 14
- •Глава 3. Дополнительные операции файлового ввода_вывода 25
- •Глава 6. Механизмы взаимодействия процессов 58
Системный вызов write
Write - выполняет запись в файловый дескриптор.
#include <unistd.h>
ssize_t write(
int fd, /* дескриптор */
const void *buf, /* адрес буфера с записываемыми данными*/
size_t nbytes /* количество данных для записи */
);
/* Возвращает количество записанных байт или -1 в случае ошибки (код ошибки в переменной errno) */
Системный вызов write записывает nbytes байт из буфера buf в открытый файл, который представлен дескриптором fd. Запись начинается с текущей позиции в файле, а по ее окончании текущая позиция смещается на число записанных байт. В вызывающую программу возвращается число байт, которое было записано или -1, если возникла ошибка. Если файл был открыт с флагом O_APPEND, то непосредственно перед записью текущая позиция автоматически будет перемещаться в конец файла. Вызов write может также использоваться для записи в каналы, в специальные файлы или сокеты, но в этих случаях он имеет некоторые особенности.
2.8. Системный вызов read
Read - выполняет чтение из файлового дескриптора.
#include <unistd.h>
ssize_t read(
int fd, /* дескриптор */
void *buf, /* адрес буфера для принимаемых данных*/
size_t nbytes /* объем принимаемых данных */
);
/* Возвращает количество прочитанных байт или -1 в случае ошибки (код ошибки в переменной errno) */
Системный вызов read считывает nbytes байт из файла, представленного дескриптором fd, и размещает их в буфере buf. Чтение начинается с текущей позиции в файле по окончании, и текущая позиция смещается на количество прочитанных байт. В вызывающую программу возвращается число прочитанных байт, 0 или -1, как признак ошибки.
Как и в случае write, чтение из канала, из специального файла или из сокета может быть заблокировано и, следовательно, прервано каким-либо сигналом. В результате вызывающему процессу возвращается число -1 и код ошибки EINTR в переменной errno.
2.9. Системный вызов close
Close - закрывает дескриптор файла.
#include <unistd.h>
int close(
int fd /* дескриптор файла */
);
/* Возвращает 0 в случае успеха или -1 в случае ошибки (код ошибки в переменной errno) */
Данный системный вызов не выталкивает на диск содержимое буферов ядра – он просто освобождает дескриптор файла для повторного использования. Когда закрывается последний дескриптор, ссылающийся на запись в таблице файлов, эта запись также может быть удалена. В свою очередь, когда удаляется последняя запись в таблице файлов, ссылающаяся на копию индексного узла в памяти, она также может быть удалена. Если счетчик ссылок данного индексного узла оказался равным 0, то с диска удаляется индексный узел и все связанные с ним данные. Фактически, закрывать дескрипторы файлов совсем не обязательно, поскольку они будут автоматически утилизированы по завершении процесса. Однако все структуры ядра лучше освобождать своевременно, а в текст программы добавлять комментарий, который будет сообщать об окончании работы с файлом. Это поможет во время отладки и предотвратит использование дескриптора файла по ошибке.