- •Введение
- •Глава 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
Каталоги
В этом разделе указывается, как читать и удалять каталоги, а также как сменить текущий каталог. Каталоги в Unix почти всегда организуются как обычные файлы, в индексном узле которых установлен специальный бит, не позволяющий ядру производить прямую запись в эти файлы.
Рассмотрим стандартные способы чтения содержимого каталогов с помощью системных вызовов:
opendir - открывает каталог
#include <dirent.h>
DIR * opendir(
const char *path /* имя каталога */
);
/* Возвращает указатель на DIR или NULL в случае ошибки (код ошибки - в переменной errno) */
closedir - открывает каталог
#include <dirent.h>
int closedir (
DIR *dirp /* указатель на DIR, полученный от opendir */
);
/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки - в переменной
errno) */
readdir - читает запись из каталога
#include <dirent.h>
struct dirent * readdir (
DIR *dirp /* указатель на DIR, полученный от opendir */
);
/* Возвращает указатель на структуру или NULL по достижении конца каталога или в случае ошибки (код ошибки - в переменной errno) */
struct dirent - структура для размещения одной записи вызовом readdir
struct dirent {
ino_t d_ino; /* номер индексного узла */
char d_name[]; /* имя */
};
rewinddir - переход в начало каталога
#include <dirent.h>
void rewinddir (
DIR *dirp /* указатель DIR, полученный от opendir */
);
seekdir - переход к требуемому местоположению
#include <dirent.h>
void seekdir (
DIR *dirp, /* указатель DIR, полученный от opendir */
long loc /* местоположение */
);
telldir - получить текущую позицию в каталоге
#include <dirent.h>
long telldir (
DIR *dirp, /* указатель DIR, полученный от opendir */
);
Назначение этих функций следующее: работа с каталогом начинается с вызова opendir, который возвращает указатель на структуру DIR. Затем этот указатель используется как аргумент во всех остальных функциях. Для чтения содержимого каталога, в цикле вызывается readdir до тех пор, пока он не вернет NULL. Если содержимое переменной errno не изменилось, то это означает, что достигнут конец каталога. Структура dirent, которую возвращает readdir, содержит номер индексного узла и имя элемента каталога. По окончании работы с каталогом он закрывается вызовом closedir. Вызов rewinddir необходим, когда нужно возобновить чтение каталога с самого начала, не закрывая и повторно не открывая его.
Системные вызовы chdir и fchdir
Представим следующие системные вызовы:
chdir - делает заданный каталог текущим
#include <unistd.h>
int chdir (
const char *path /* имя каталога */
);
/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки - в переменной
errno) */
fchdir - делает текущим каталог по дескриптору
#include <unistd.h>
int fchdir (
int fd /* дескриптор файла */
);
/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки - в переменной
errno) */
Аргумент системного вызова chdir может быть и абсолютным, и относительным маршрутом к каталогу.