- •Введение
- •Глава 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
Контрольные вопросы
Реализуйте упрощенный интерфейс обмена сообщениями на базе сокетов.
Разработайте сетевой поисковый робот, который начинает поиск с заданного URL. Просматривает найденную страницу, извлекает из нее все обнаруженные абсолютные ссылки и помещает их в свой список. Затем робот должен обойти все найденные ссылки, получить по ссылкам Web – страницы и извлечь из них дополнительные ссылки. Поиск повторять до тех пор, пока число ссылок в списке не превысит некоторое значение или пока программа не будет прервана.
Напишите программу, которая возвращает информацию о хосте по его имени.
Разработайте приложение, которое запускает несколько узлов, выполняющих передачу данных на один и тот же адрес.
Разработайте Web – браузер, который получает HTML – документы от сервера и все полученные данные будут выводиться на устройство стандартного вывода.
Литература
Глас Г., Эйблс К. Unix для программистов и пользователей. / Г. Глас, К. Эйблс – СПб.: БХВ-Петербург, 2004. – 848 с.: ил.
Брюс М. Unix/Linux: Теория и практика программирования. / М.Брюс – Издательство: Кудиц-Образ, 2004. -576 с.
Вейрле К. Linux: сетевая архитектура. Структура и реализация сетевых протоколов в ядре. / К. Вейрле. – Издательство: Кудиц-Образ, 2006. -656 с.
Собель М.Г. Linux. Администрирование и системное программирование. / М.Г. Собель. - Издательство: Питер, 2011. – 880 с.
Глава 8.Сигналы и таймеры
Сигнал – это сообщение о наступлении некоторого события, например, нажатия комбинации клавиш CTRL+C, ошибки выполнения арифметической операции и т.п. Обычно сигналы передаются процессам и потокам асинхронно, то есть – прерывают работу процесса или потока, вне зависимости от того, чем они в данный момент времени были заняты. Сигнал может вызвать немедленное завершение процесса или быть перехваченным и обработанным специальной функцией.
Введение в сигналы
Ниже приводится пример программы, которая демонстрирует перехват и обработку сигналов. Она выводит число каждые три секунды, а при получении сигнала прерывания (SIGINT), выводит сообщение и завершается:
static void fcn(int signum)
{
(void)write(STDOUT_FILENO, “Получен сигнал\n”, 15);
_exit(EXIT_FAILURE);
}
int main(void)
{
int i;
struct sigaction act;
memset(&act, 0, sizeof(act));
act.sa.handler = fcn;
sigaction(SIGINT, &act, NULL);
for (i = 1; ; i++) {
sleep(3);
printf(“%d\n”, i);
}
exit(EXIT_SUCCESS);
EC_CLEANUP_BGN
exit(EXIT_FAILURE);
EC_CLEANUP_END
}
Обращением к системному вызову sigaction производится установка функции-обработчика сигнала SIGINT. После запуска программы, когда на экране появилось число 2, нужно нажать на клавишу CTRL+C. Это приведет к тому, что исполнение программы будет прервано и управление перейдет к функции fcn, которая выведет текст сообщения и завершит работу программы, обратившись к системному вызову _exit. В результате, на экране появится:
1
2
Получен сигнал
Если бы функция-обработчик не была установлена, нажатие комбинации CTRL+C привело бы к немедленному завершению работы процесса, потому что в этом заключается реакция по умолчанию любого процесса на сигнал SIGINT.
С помощью системного вызова sigaction можно заставить процесс игнорировать сигнал SIGINT:
int main(void)
{
int i;
struct sigaction act;
memset(&act, 0, sizeof(act));
act.sa.handler = SIG_IGN;
sigaction(SIGINT, &act, NULL);
for (i = 1; ; i++) {
sleep(3);
printf(“%d\n”, i);
}
exit(EXIT_SUCCESS);
EC_CLEANUP_BGN
exit(EXIT_FAILURE);
EC_CLEANUP_END
}
На этот раз программа будет продолжать выводить числа, невзирая на нажатия клавиш CTRL+C. Завершить ее можно нажатием комбинации CTRL+\, которая порождает сигнал SIGQUIT. Работа с сигналами достаточно сложна, потому что:
существует значительное количество различных сигналов и нередко обстоятельства, их породившие, очень трудны для понимания;
выбор той или иной реакции на сигнал может оказаться непростым;
обработка сигнала может быть связана с серьезными трудностями.