- •Введение
- •Глава 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
Жесткие и символические ссылки
Запись в файле каталога, содержащая имя и номер индексного узла, называется жесткой ссылкой. Существует еще один тип ссылок – символические ссылки. Вы получаете жесткую ссылку, когда создаете файл любого типа, включая каталоги. Можно создать дополнительные жесткие ссылки на файлы, не являющиеся каталогами, с помощью системного вызова link:
link - создает жесткую ссылку
#include <unistd.h>
int link (
const char *oldpath, /* старое имя файла */
const char *newpath /* новое имя файла */
);
/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки в переменной errno) */
Первый аргумент (oldpath) должен быть именем существующей жесткой ссылки - она представляет номер используемого индексного узла. Второй аргумент (newpath) задает имя новой жесткой ссылки. Старая и новая ссылки абсолютно равноправны, так как Unix не различает первичные и вторичные ссылки. Процесс, создающий жесткую ссылку, должен иметь право на запись в каталог, где она будет размещаться. Имени ссылки, представленной во втором аргументе, не должно существовать - системный вызов link не умеет изменять существующие ссылки. В случае необходимости, существующая ссылка должна быть сначала удалена вызовом unlink или переименована вызовом rename. Это единственный способ переименовать каталог без полного копирования его содержимого:
rename - переименовывает файл
#include <stdio.h>
int rename (
const char *oldpath, /* старое полное имя */
const char *newpath /* новое полное имя */
);
/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки в переменной errno) */
Вызов rename выполняет примерно следующую последовательность действий:
eсли newpath существует, то он удаляется с помощью unlink или rmdir;
выполняется link, даже если oldpath является каталогом;
вызовом unlink или rmdir удаляется oldpath.
Если oldpath является символической ссылкой, то rename работает с ней, а не с тем, на что она ссылается.
Системный вызов getcwd
Это очень простой системный вызов, который служит для получения имени текущего каталога:
getcwd - возвращает полное имя текущего каталога
#include <unistd.h>
char *getcwd (
char *buf, /* старое имя файла */
size_t bufsize /* новое имя файла */
);
/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки в переменной errno) */
Отображение метаданных файла
Индексный узел содержит полный набор метаданных о файле – все, кроме имени, которое в действительности никак не связано с индексным узлом и данными, на которые он указывает. Для получения информации из индексных узлов, существуют три стандартных системных вызова - stat, lstat и fstat и одна очень известная команда - ls.
stat - возвращает сведения о файле по его имени
#include <sys/stat.h>
int stat (
const char *path, /* полное имя файла */
struct stat * buf /* возвращаемая информация */
);
/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки в переменной errno) */
lstat - возвращает сведения о файле по его имени без разыменования символических ссылок
#include <sys/stat.h>
int lstat (
const char *path, /* полное имя файла */
struct stat * buf /* возвращаемая информация */
);
/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки в переменной errno) */
fstat - возвращает сведения о файле по дескриптору
#include <sys/stat.h>
int f stat (
const char *path, /* дескриптор файла */
struct stat * buf /* возвращаемая информация */
);
/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки в переменной errno) */
Системный вызов stat принимает полное имя файла и находит соответствующий ему индексный узел. Вызов fstat принимает дескриптор открытого файла и отыскивает соответствующий индексный узел в таблице активных узлов ядра. Вызов lstat аналогичен вызову stat за одним исключением – если в качестве имени файла была передана символическая ссылка, то будет возвращена информация о самой ссылке, а не об объекте, который она представляет. Все три вызова возвращают одни и те же метаданные, через структуру типа stat, в первом аргументе. Ниже приводится определение структуры stat:
struct stat {
dev_t st_dev /* идентификатор устройства файловой системы */
ino_t st_ino; /* номер индексного узла */
mode_t st_mode; /* режим */
nlink_t st_nlink; /* количество жестких ссылок */
uid_t st_uid; /* идентификатор пользователя */
gid_t st_gid; /* идентификатор группы */
dev_t st_rdev; /* идентификатор устройства */
off_t st_size; /* размер в байтах */
time_t st_atime; /* время последнего обращения */
time_t st_mtime; /* время последнего изменения */
time_t st_ctime; /* время последнего изменения индексного узла */
blksize_t st_blksize; /* оптимальный размер блока для операций ввода-вывода */
blkcnt_t st_blocks; /* количество блоков по 512 байт */
};