- •Министерство образования и науки Украины
- •Практическое занятие №1
- •1.1. Сокращенная запись двоичных чисел в восьмеричной и шестнадцатеричной системах счисления
- •1.2. Преобразование восьмеричных и шестнадцатеричных чисел в двоичные
- •1.3. Преобразование двоичных, восьмеричных и шестнадцатеричных чисел в десятичные
- •1.4. Преобразование десятичных чисел в двоичные, восьмеричные и шестнадцатеричные
- •2. Упражнения
- •3. Содержание отчёта
- •Практическое занятие №2
- •1.1. Вход в систему
- •1.2. Редактирование командной строки
- •1.3. Память командных строк
- •1.4. Переключение виртуальных консолей
- •1.5. Изменение консольных шрифтов
- •1.6. Основные команды
- •Выполнение некоторых команд
- •2. Команда просмотра содержимого каталогов -ls (LiSt) – выдает на экран перечень файлов и каталогов (по умолчанию из текущего каталога).
- •Жесткая ссылка обозначает ся так же, как файл, на который она ссылается, счетчик ссылок при этом будет иметь значение больше 1.
- •3. Команда создание новых каталогов - mkdir.
- •5. Команда копирование файлов -cp (CoPy).
- •6. Команда перемещение файлов - mv (MoVe).
- •7. Команда удаление файлов - rm (ReMove).
- •8. Команды просмотра содержимого файлов more и cat.
- •Подстановочные символы
- •1.7. Выход из системы
- •2. Упражнения
- •Используя справочную информацию из п.1.6 Основные команды, изучите работу рассмотренных команд с различными параметрами и опциями:
- •1.2. Перенаправление ввода и вывода
- •1.3. Перенаправление с добавлением
- •1.4. Использование конвейера
- •2. Упражнения
- •3. Содержание отчёта
- •Справочная информация
- •Практическое занятие №4 Псевдонимы команд в ос qnx Цель – создание псевдонимов команд для облегчения работы в среде ос qnx
- •1. Краткие теоретические сведения
- •1.1. Управление связями файлов
- •1.2. Жесткие связи
- •1.3. Символические связи
- •1.4. Права доступа к файлам
- •1.5. Зависимости
- •1.6. Изменение прав доступа
- •2. Упражнения
- •3. Содержание отчёта
- •1.2. Сравнение файлов (команда diff)
- •1.3. Подсчет числа слов, строк и байт в файле (команда wc)
- •1.4. Потоковый редактор sed
- •2. Упражнения
- •/Usr/bin/grep
- •/Usr/xpg4/bin/grep
- •/Usr/xpg4/bin/grep
- •Операнды
- •/Usr/bin/grep
- •/Usr/xpg4/bin/grep
- •Использование
- •Работа с большими файлами
- •/Usr/bin/who
- •/Usr/xpg4/bin/who
- •Операнды
- •1.1. Ввод текста
- •1.2. Редактирование текста
- •1.3. Сохранение файлов и выход из VI
- •1.4. Редактирование еще одного файла
- •1.5. Включение других файлов
- •1.6. Выполнение команд Shell
- •2. Упражнения
- •3. Содержание отчёта
- •Практическое занятие №7 Работа с текстовыми файлами Цель – знакомство с командами, работающими с текстовыми файлами (awk-интерпретатор скриптовый)
- •1. Краткие теоретические сведения
- •1.1. Язык awk
- •1.2. Регулярные выражения
- •Метасимволы, используемые в регулярных выражениях
- •1.3. Действия
- •1.4. Awk-переменные и выражения
- •1.5. Использование операций
- •1.6. Использование массивов
- •1.7. Селекторы
- •1.8. Использование операторов
- •1.9. Ввод и вывод данных
- •1.10. Встроенные функции
- •2. Упражнения
- •Структура файла query1
- •Структура файла query2
- •3. Содержание отчёта
- •1.2. Граматика языка shell
- •2. Упражнения
- •3. Содержание отчёта
- •Выполнить:
- •2. Упражнения
- •Примечание:
- •3. Содержание отчёта
- •1.1. Компоновка объектных модулей
- •1.2. Отладка
- •2. Упражнения
- •Задание №1
- •Задание №2
- •Задание №3
- •Задание №4
- •Задание №5
- •Задание №6
- •Задание №13
- •Задание №14
- •Задание №15
- •Задание №16
- •Задание №17
- •Практическое занятие №11
- •2. Упражнения
- •3. Содержание отчёта
- •1.2. Создание каталога
- •1.3. Биты режима для прав доступа
- •1.4. Удаление каталога
- •1.5. Создание жесткой связи
- •1.6. Создание символической связи
- •1.7. Чтение символической связи
- •1.8. Переименование файла
- •1.9. Удаление файла
- •1.10. Обработка ошибок
- •2. Упражнения
- •3. Содержание отчёта
- •1.2. Проверка возможностей управления работой и процессами в shell
- •2. Упражнения
- •3. Содержание отчёта
- •1.3. Ошибки, связанные с именами файлов
- •1.4. Доступ к файлу
- •2. Упражнения
- •3. Содержание отчёта
- •Практическое занятие №15 Организация процессов вQnx
- •1. Методические указания по выполнению практической работы
- •1.1. Файл main.O
- •1.2. Файл input.C
- •1.3. Файл output.C
- •1.4. Файл process.C
- •1.5. Используемые функции
- •1.6. Получение информации о процессах
- •2. Упражнения
- •1.2. Клиент
- •1.3. Определение идентификаторов узла, процесса и канала (nd/pid/chid) нужного сервера
- •1.4. Применение обмена сообщениями
- •2. Упражнения
- •3. Содержание отчёта
- •Практическое занятие №17 Организация потоков в qnx
- •1. Краткие теоретические сведения
- •1.1. Запуск потока
- •1.2. Администрирование атрибутов потока
- •Текст программы
- •Результаты
- •1.2. Текст программы
- •1.3. Последовательность действий
- •1.4. Результаты
- •2. Упражнения
- •3. Содержание отчёта
2. Упражнения
УПРАЖНЕНИЕ 2.1.
Написать программу, которая, используя приведенные выше функции, открывает заранее подготовленные файлы и демонстрирует возможности записи и чтения информации из них. При этом необходимо реализовать запись информации (из одного файла в другой) в конец, в начало, в середину файла.
УПРАЖНЕНИЕ 2.2.
Продемонстрировать возможности использования дублирования дескрипторов файлов. Необходимо выполнять контроль правильности выполняемых операций.
УПРАЖНЕНИЕ 2.3.
Проанализируйте результаты и отметьте выявленные ограничения.
3. Содержание отчёта
Номер, название и цель работы.
Текст программы.
Результаты работы программы и результаты проведенного анализа.
Практическое занятие №15 Организация процессов вQnx
Цель – ознакомиться со способами организации дочерних процессов, предоставляемыми системой QNX
Системой предоставляется пять основных способов организации процессов:
разветвление текущего процесса на процесс-родитель и процесс потомок (системный вызов fork);
подмена выполняемой процессом задачи (системный вызов exec);
порождение независимого процесса (системный вызов spawn);
выполнение системной утилиты QNX (системный вызов system);
(системный вызов vfork)
Более подробная информация, включающая в себя синтаксис команд, их описание и примеры применения предоставлена в качестве справочного материала.
1. Методические указания по выполнению практической работы
Данные методические указания являются лишь одним из способов реализации поставленной задачи. Выбор способа реализации полученного задания предоставляется на усмотрение студента. Однако, выполненное задание должно в полной мере соответствовать условиям поставленной задачи.
В предоставляемом примере задача по ведению базы данных разбита на три модуля:
модуль input.o производит ввод данных в базу данных (база данных имеет произвольный формат);
модуль output.o позволяет производить просмотр содержимого базы данных;
модуль process.o производит обработку данных, содержащихся в базе данных;
модуль main.o является основной программой, из которой происходит вызов ранее описанных модулей.
Для большей наглядности рекомендуется каждый из составных модулей снабдить средствами вывода идентификатора текущего процесса.
Информационная схема, описывающая направление информационных потоков приведена на рисунке 1.
На рисунке 2 представлена блок-схема алгоритма работы основной программы, поскольку именно в ней содержатся системные вызовы дочерних процессов.
Рис. 1. Направление информационных потоков между модулями
1.1. Файл main.O
Эта основная программа производит создание дочерних процессов различными
// способами, такими как: fork, exec, spawn
# include <fcntl.h>
# include <sys/stat.h>
# include <errno.h>
# include <semaphore.h>
# include <stdio.h>
# include <stdlib.h>
# include <spawn.h>
int error; // хранение ошибки
int child_pid; // идентификатор дочернего
// процесса
int main ()
{printf ("Идентификатор родительского процесса равен %d\n", getpid ());
fflush (stdout);
// Дочерний процесс в данном примере не выполняет никаких действий
if (child_pid = fork ())
{printf ("\n Идентификатор родительского процесса равен: %d\n",getpid());
// выполнение системной утилиты ls (чтение оглавления каталога)
// посредством функции system
system (“ls”);
// родительский процесс дожидается завершения выполнения запускаемой
// программы
printf ("\n Выполнение внешней программы посредством функции spawnl
\n");
// Обработка возможных ошибок
if (spawnl(P_WAIT, "input.o", "input.o",NULL, NULL)==-1)
printf ("Возникла ошибка!!! - %s", strerror(error));
// родительский процесс не дожидается завершения выполнения запускаемой
// программы
printf ("\n Выполнение внешней программы посредством функции spawnl
\n");
// Обработка возможных ошибок
if (spawnl(P_WAIT, "output.o", "output.o",NULL, NULL))
printf ("Возникла ошибка!!! - %s", strerror(error));
printf ("\n Выполнение внешней программы посредством функции execl \n");
if (execl("process.o", "process.o",NULL)==-1)
printf ("Возникла ошибка!!! - %s", strerror(error));
printf ("\n Эта строка не будет появляться на экране!!!");}
else {printf ("Идентификатор дочернего процесса равен: %d\n",getpid ());}
}
Рис. 2. Алгоритм выполнения основной программы
Приведем некоторое словесное описание работы программы.
Основная программа содержит в себе системный вызов fork(), который производит порождение дочернего процесса. Для обоих процессов (как родительского, так и дочернего) производится вывод на экран идентификаторов процессов. Поскольку тело дочернего процесса более ничего не содержит, он завершается, в то время как родительский процесс продолжает своё выполнение.
Родительским процессом производится выполнение системного вызова system(), результаты выполнения которого можно увидеть на экране в виде листинга содержимого текущего каталога. После этого осуществляется последовательный запуск трёх внешних модулей при помощи различных системных средств.
Самая последняя строка в родительском процессе приведена лишь для наглядности действий, выполняемых системным вызовом execl().
Следует отметить, что в данной лабораторной работе системный вызов vfork() не используется. По своим возможностям он очень сходен с системным вызовом fork() , с тем лишь отличием, что в отличие от вызова fork() вызовом vfork() происходит порождение двух полностью независимых процессов.