- •Введение
- •Глава 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
Системные вызовы mkdir и rmdir
Следующие два системных вызова создают и удаляют каталоги:
mkdir - создает каталог
#include <sys/stat.h>
int mkdir (
const char *path, /* полное имя каталога */
mode_t perms /* права доступа */
);
/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки - в переменной
errno) */
rmdir - удаляет каталог
#include <unistd.h>
int rmdir (
const char *path, /* полное имя каталога */
);
/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки - в переменной
errno) */
Окончательные права доступа к каталогу, создаваемому вызовом mkdir, определяются в соответствии с маской. Перед удалением каталог должен быть пустым. Если каталог не пуст, то сначала придется удалить все вложенные подкаталоги и файлы серией вызовов unlink и mkdir.
Изменение индексного узла
В таблице 3.1 показано, какие системные вызовы, какие поля индексного узла изменяют. Прочерк означает, что это поле вообще не изменяется, оно получает свое значение в момент создания индексного узла. Побочный эффект означает, что это поле изменяется только в результате побочного эффекта от какого-либо воздействия, например, в результате создания новой ссылки системным вызовом link, но не может изменяться непосредственно.
Таблица 3.1. Изменения полей индексных узлов
Поле |
Описание |
Каким вызовом изменяется |
st_dev |
идентификатор устройства файловой системы |
- |
st_ino |
номер индексного узла |
- |
st_mode |
режимы |
chmod, fchmod |
st_nlink |
количество жестких ссылок |
побочный эффект |
st_uid |
идентификатор пользователя |
chown, fchown, lchown |
st_gid |
идентификатор группы |
chown, fchown, lchown |
st_rdev |
идентификатор устройства |
- |
st_size |
размер в байтах |
побочный эффект |
st_atime |
время последнего обращения |
побочный эффект |
st_mtime |
время последнего изменения |
utime |
st_ctime |
время последнего изменения индексного узла |
utime |
st_blksize |
оптимальный размер блока для операций ввода-вывода |
- |
st_blocks |
размер в блоках по 512 байт |
побочный эффект |
chmod - изменяет режимы доступа по имени файла
#include <sys/stat.h>
int chmod (
const char *path, /* имя файла */
mode_t mode /* новые режимы */
);
/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки - в переменной
errno) */
fchmod - изменяет режимы доступа по дескриптору файла
#include <sys/stat.h>
int fchmod (
int fd, /* дескриптор файла */
mode_t mode /* новые режимы */
);
/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки - в переменной
errno) */
Системный вызов chmod изменяет режимы доступа к существующему файлу любого типа. Системный вызов fchmod очень похож на chmod, но в качестве аргумента принимает не имя, а дескриптор файла. Изменить режимы доступа может только процесс, имеющий права суперпользователя, или идентичный файлу действующий идентификатор пользователя. Недостаточно иметь права на запись в файл. Кроме того, чтобы установить флаг S_ISGID, процесс должен иметь идентичный файлу действующий идентификатор группы (кроме суперпользователя). Если не собираетесь менять режимы доступа целиком, то сначала нужно получить существующие режимы вызовом stat, затем установить или сбросить необходимые биты и потом вызвать chmod для изменения режимов.
Системные вызовы chown, fchown и lchown
Системный вызов chown изменяет идентификаторы пользователя и группы файла. Эта операция доступна только владельцу файла и суперпользователю. Если один из аргументов имеет значение -1, то соответствующий ему идентификатор остается без изменений.
chown - изменяет владельца и группу файла по его имени
#include <unistd.h>
int chown (
const char *path, /* имя файла */
uid_t uid, /* новый идентификатор пользователя */
gid_t gid /* новый идентификатор группы*/
);
/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки - в переменной
errno) */
fchown - изменяет владельца и группу файла по дескриптору
#include <unistd.h>
int fchown (
int fd, /* дескриптор файла */
uid_t uid, /* новый идентификатор пользователя */
gid_t gid /* новый идентификатор группы*/
);
/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки - в переменной
errno) */
lchown - изменяет владельца и группу символической ссылки по ее имени
#include <unistd.h>
int lchown (
const char *path, /* имя ссылки */
uid_t uid, /* новый идентификатор пользователя */
gid_t gid /* новый идентификатор группы*/
);
/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки - в переменной
errno) */
Системный вызов lchown воздействует на саму символическую ссылку, а не на объект ссылки.
Системный вызов utime
Вызов utime устанавливает время последнего обращения и изменения файла:
#include <utime.h>
int utime (
const char *path, /* имя файла */
const struct utimbuf *timbuf /* новое время */
);
/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки - в переменной
errno) */
struct utimbuf - используемая при обращении к вызову utime
struct utimbuf {
time_t actime; /* время последнего обращения */
time_t modtime; /* время последнего изменения*/
};
Системный вызов utime изменяет время последнего обращения и последнего изменения файла любого типа. Тип time_t описывает число секунд, прошедших с начала эпохи. Только владелец и суперпользователь могут изменить время последнего обращения и изменения. Если вместо указателя на timbuf передается значение NULL, то используется текущее время. Сделано это для того, чтобы иметь возможность имитировать обновление файла без необходимости перезаписи и в первую очередь для удобства команды touch. Любой процесс, обладающий правом на запись в файл, может обратиться к этому вызову. Этот вызов часто применяется к файлам, полученным из резервных копий или по сети, когда времена устанавливаются в их первоначальные значения. Время последнего изменения индексного узла не может быть переустановлено, но этого и не требуется, поскольку индексные узлы не перемещаются - они каждый раз создаются заново.
Системный вызов mknod
Системный вызов mknod создает файл:
#include <sys/stat.h>
int mknod (
const char *path, /* имя файла */
mode_t perms, /* права доступа */
dev_t dev /* идентификатор устройства */
);
/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки - в переменной
errno) */
Системный вызов mknod может создавать обычные файлы, каталоги, специальные файлы и именованные каналы. Единственная переносимая операция, которую можете сделать с помощью mknod, не обладая правами суперпользователя, это создать именованный канал, но для этого существует системный вызов mkfifo. Основное назначение mknod - это создание специальных файлов устройств, как правило, в каталоге /dev. Делается это обычно во время установки нового драйвера устройства, когда вызывается команда mknod, которая обращается к одноименному системному вызову. Аргумент perms задает права доступа к файлу с использованием битовых масок. Аргумент dev - это идентификатор устройства.