- •Введение
- •Глава 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
Системные вызовы getpwuid, getgrgid и getlogin
Числовые идентификаторы группы и владельца получить несложно - они находятся в полях st_gid и st_uid структуры stat, но нам нужно преобразовать эти идентификаторы в имена. Для этих целей предназначены функции getgrgid и getpwuid, которые на самом деле не являются системными вызовами, так как вся необходимая им информация находится в файлах со списками пользователей и групп. Проблема в том, что стандарты никак не регламентируют местоположение этих файлов. Ниже приводится пример типичной записи из файла паролей ОС Solaris для пользователя marc:
$ grep marc /etc/passwd
marc:x:100:14::/home/marc:/bin/sh
Единственное, чего нет в файле паролей, так это самого пароля. Пароли хранятся в зашифрованном виде в другом файле, который доступен только суперпользователю. В данной системе пользователь marc входит в состав нескольких групп, но группой по умолчанию является группа 14:
$ grep 14 /etc/group
sysadmin::14:
getpwuid - возвращает запись из файла паролей
#include <pwd.h>
struct passwd * getpwuid(
uid_t uid /* числовой идентификатор пользователя */
);
/* Возвращает указатель на структуру или NULL в случае ошибки (код ошибки - в переменной errno) */
struct passwd - структура для возвращаемого значения getpwuid
struct passwd {
char *pw_name; /* имя пользователя (login) */
uid_t pw_uid; /* числовой идентификатор пользователя */
gid_t pw_gid; /* числовой идентификатор группы по умолчанию*/
char *pw_dir; /* домашний каталог */
char *pw_shell; /* командный интерпретатор по умолчанию */
};
getgrgid - возвращает запись из файла со списком групп
#include <grp.h>
struct group * getgrgid (
gid_t gid /* числовой идентификатор группы */
);
/* Возвращает указатель на структуру или NULL в случае ошибки (код ошибки - в переменной errno) */
struct group - структура для возвращаемого значения getgrgid
struct group {
char *gr_name; /* имя группы */
gid_t gr_gid; /* числовой идентификатор группы */
char **gr_mem; /* массив-список членов группы */
};
В структурах указаны поля, которые определены стандартами. В каждой конкретной реализации эти структуры могут иметь дополнительные поля, за более точными сведениями следует обратиться к соответствующим заголовочным файлам.
Теперь можно использовать эти две функции для вывода имени пользователя и группы или просто числовых идентификаторов, если их имена неизвестны. Имена могут быть неизвестны, если анализируются файлы на сетевых файловых системах - в этом случае пользователь одной системы может отсутствовать на другой:
static void print_owner(const struct stat *statp)
{
struct passwd *pwd = getpwuid(statp->st_uid);
if (pwd == NULL)
printf(“ %-8ld”, (long)statp->st_uid);
else
printf(“ %-8s”, pwd->pw_name);
}
static void print_group(const struct stat *statp)
{
struct group *grp = getgrgid(statp->st_gid);
if (grp == NULL)
printf(“ %-8ld”, (long)statp->st_gid);
else
printf(“ %-8s”, grp->gr_name);
}
Следующая функция возвращает имя, под которым пользователь зарегистрировался в системе:
getlogin - возвращает имя, под которым пользователь зарегистрировался в системе
#include <unistd.h>
char * getlogin(void);
/* Возвращает структуру или NULL в случае ошибки (код ошибки - в переменной errno) */