- •Министерство образования и науки Украины
- •1. Определение системам реального времени
- •1.1. Основные понятия
- •1.2. Срв
- •1.3. Классификация срв
- •1.4. Структура срв
- •Основные требования к срв и их особенности
- •1.4.1. Ос
- •1.4.2. Основные архитектурные решения ос
- •1.4.3. Основные концепции ос
- •Прерывания
- •Системные вызовы
- •Файловая система
- •Процессы
- •Нити (потоки)
- •Понятие ресурса
- •1.5. Аппаратные среды срв
- •1.5.1. Мультипрограммная среда
- •Состояния процесса (см. Рисунок 4.).
- •1.5.2. Симметричная мультипроцессорная среда (рис. 5)
- •1.5.3. Распределенная среда (рис. 6)
- •1.6. Конфигурации клиент-серверных систем (рис.7.)
- •1.7. Средства ввода-вывода срв
- •2.1. Версии qnx
- •2.2. Posix-совместимость
- •2.3. Архитектура микроядра qnx
- •2.3.1. Микроядро
- •2.3.2. Системные процессы
- •2.3.3. Системные и пользовательские процессы
- •2.3.4. Драйверы устройств
- •2.3.5. Межпроцессное взаимодействие
- •2.3.6. Сеть qnx
- •2.4. Файлы и файловая система
- •2.4.1. Типы файлов
- •2.4.2. Жесткие ссылки
- •2.4.3. Символические ссылки
- •2.4.4. Named Special Device — именованные специальные устройства
- •2.4.5. Именованные программные каналы (fifo) (Именованный канал)
- •2.5. Структура файловой системы qnx
- •2.6. Концепция прав доступа
- •3. Начало работы
- •3.1. Интерфейс командной строки
- •3.2. Консоль командной строки
- •3.3. Соглашения по работе с командной строкой
- •3.4. Знакомство с shell
- •3.5. Обращение к домашнему каталогу
- •3.6. Базовые команды
- •3.6.1. Изменение текущего каталога
- •3.6.2. Просмотр содержимого каталогов
- •Жесткая ссылка обозначает ся так же, как файл, на который она ссылается, счетчик ссылок при этом будет иметь значение больше 1.
- •3.6.3. Создание новых каталогов
- •3.6.4. Копирование файлов
- •3.6.5. Перемещение файлов
- •3.6.6. Удаление файлов
- •3.6.7. Удаление каталогов
- •3.6.8. Просмотр содержимого файлов
- •3.6.9. Конкатенация (слияние) и просмотр файлов
- •3.6.10. Получение оперативной помощи
- •4. Объектно-ориентированное программирование
- •4.1. Системы программирования
- •4.2. Создание приложения
- •4.3. Средства отладки программ
- •5. Архитектура ос qnx
- •5.1. Типы процессов
- •5.2. Механизмы микроядра
- •5.3. Диспетчеризация потоков
- •5.4. Администратор процессов
- •5.5. Управление памятью
- •5.6. Управление пространством путевых имен
- •5.7. Пространство путевых имен
- •5.7.1. Файловая система qnx
- •5.7.2. Виртуальные устройства
- •Устройство /dev/null
- •Устройство /dev/zero
- •Устройство /dev/full
- •Устройства генерирования случайных чисел
- •5.8. Программы, процессы, нити
- •5.9. Свойства процессно-нитиевой структуры прв
- •5.10. Программный интерфейс qnx
- •5.10.1. Системные вызовы и функции стандартных библиотек
- •5.10.2. Обработка ошибок
- •5.11. Формальные параметры функции main
- •5.12. Разграничение доступа к файлам
- •5.13. Функции базового ввода/вывода
- •5.13.1. Открытие файла
- •5.13.2. Дублирование дескриптора файла
- •5.13.3. Доступ к файлу
- •6. Функции управления файловой системой
- •6.1. Смена корневого каталога
- •6.2. Смена текущего каталога
- •6.3. Создание каталога
- •6.4. Удаление каталога
- •6.5. Создание жесткой связи
- •6.6. Создание символической связи
- •6.7. Чтение символической связи
- •6.8. Переименование файла
- •6.9. Удаление файла
- •7. Микроядро
- •7.1. Запуск процессов
- •7.2. Запуск процесса из shell
- •7.3. Программный запуск процессов
- •7.3.1. Функция system()
- •7.3.2. Функции семейства exec*()
- •7.3.3. Функции семейства spawn*()
- •7.3.4. Функция fork()
- •7.3.5. Функция vfork()
- •7.4. Организация взаимодействия между процессами
- •7.5. Создание и удаление каналов Создание канала.
- •Удаление канала
- •7.6. Установление и удаление соединений с каналом Установление соединения
- •Int ConnectAttach(uint32_t nd, pid_t pid, int chid, unsigned index, int flags);
- •Разрыв соединения
- •Int ConnectDetach(int coid);
- •7.7. Передача сообщений
- •7.7.1. Посылка сообщения
- •IntMsgSend(int coid, constvoid* smsg, int sbytes, void* rmsg, int rbytes);
- •7.7.2. Прием сообщения
- •Int MsgReceive(int chid, void *msg, int bytes, struct _msg_info *info);
- •7.7.3. Посылка ответа
- •Int MsgReply(int rcvid,int status,const void* msg, int size);
- •7.7.4. Сценарии ответов
- •7.7.5. Управление сообщениями
- •7.7.6. Управление приемом сообщений
- •7.7.7. Управление передачей ответа
- •Int MsgSendv(int coid, const iov_t* siov, //Массив iov сообщения int sparts, //Количество iov сообщения const iov_t* riov, //Массив iov ответа int rbytes); //Количество iov ответа
- •Int MsgReceivev(int chid, const iov_t* riov, //Массив iov буфера int sparts, //Количество iov буфера struct_msg_info* riov);
3.3. Соглашения по работе с командной строкой
В QNX приняты традиционные для UNIX-систем соглашения об интерпретации аргументов командной строки. Аргументы подразделяются на две категории: опции (или флаги) и все остальные. Опции меняют поведение программы, а остальные аргументы содержат разного рода входные данные (например, названия файлов). Опции бывают двух видов.
Короткие опции состоят из дефиса и одиночного символа (обычно это буква в нижнем или верхнем регистре). Такие опции быстрее и проще набирать.
Длинные опции состоят из двух дефисов, после которых следует имя, содержащее буквы нижнего и верхнего регистров и дефисы. Такие опции легче запоминать и читать (например, в командных сценариях).
Обычно системные программы поддерживают обе разновидности каждой опции: первую - для краткости, вторую - для ясности. Например, большинство программ понимает опции -h и --help и трактуют их одинаково. Как правило они указываются в командной строке сразу после имени программы. После опций могут идти другие аргументы, в частности имена файлов и другие входные данные.
3.4. Знакомство с shell
После ввода правильных имени и пароля утилита login запускает командный интерпретатор (login shell). Что такое командный интерпретатор? Это программа, которая выдает на экран приглашение (для "простого" пользователя — $, для суперпользователя — #), принимает команды и запускает их.
В одной системе можно одновременно использовать любые интерпретаторы. Если пользователь работает в графической оболочке Photon, то командная строка доступна ему с помощью графического псевдотерминала — программы pterm.
Поскольку shell является интерпретатором команд, то команда — это базовое понятие. Команды в shell обычно имеют следующий формат:
<имя команды> <опции> <аргумент(ы)>
В общем, каждая команда может иметь несколько опций, которые обычно записываются со знаком ``-''. (Часто в документации вместо термина опция используют в том же контексте слово "флаг").
Например:
ls -ls /usr/bin
ls -имя команды выдачи содержимого директория,
-ls -опции ("-" - признак опций, l - длинный формат, s - об'ем файлов в блоках).
/usr/bin - директорий, для которого выполняется команда.
Эта команда выдаст на экран в длинном формате содержимое директория /usr/bin, при этом добавит информацию о размере каждого файла в блоках.
Как правило (но не всегда), первое слово (т.е. последовательность символов до пробела, табуляции или конца строки) shell воспринимает, как команду. Поэтому в командной строке
cat cat
первое слово будет расшифровано shell, как команда (конкатенации), которая выдаст на экран файл с именем "cat" (второе слово), находящийся в текущем директории. Многие часто используемые команды состоят из двух-трех букв.
Команды могут быть как отдельными программами (утилитами), так и "встроенными" командами shell.
Когда вы вводите команду, shell делает несколько вещей. Во-первых, смотрит на то, что может (должно) быть именем команды и является ли это внутренней для shell командой. (Внутренняя, это команда, которую shell знает как выполнять.) Shell также проверяет, не является ли команда синонимом другой или требуется подстановка имени. Если этого не надо делать, shell ищет соответствующую этому имени программу на диске. Если shell находит такую программу, он ее выполняет, передавая ей аргументы из командной строки.
К сожалению, структура команды выдерживается далеко не всегда. Не всегда перед флагами ставится минус, не всегда флаги идут одним словом. Есть разнообразие и в представлении аргументов. К числу команд, имеющих экзотические форматы, относятся и такие "ходовые" команды, как сс, tar, dd, find и ряд других.
Характерна в этом смысле утилита tar (Tape Archiv). Чтобы извлечь содержимое архива, запишем:
tar xvf arxive.tar
где, как вы уже догадались:
tar — имя утилиты;
xvf — опции (х — извлечь; v — показывать на экране ход "расТАРивания"; f — "расТАРивать" указанный файл, а не ленту в стримере);
archive.tar — имя архивного файла.
Обратите внимание, что перед опциями нет дефиса (-). Этот нюанс постоянно сбивал с толку пользователей, поэтому в современных реализациях утилиты tar поддерживается два варианта задания опций: с дефисом и без него.
Существует несколько сотен команд, но обычно пользователь применяет лишь несколько десятков. Наиболее часто используемые команды приведены в табл. 11.1.
Что нужно сделать? |
Команда (без аргументов) |
Определить текущий каталог |
pwd |
Просмотреть содержимое каталога |
ls |
Перейти в другой каталог |
cd |
Создать пустой файл |
touch |
Создать каталог |
mkdir |
Копировать файл |
ср |
Копировать каталог |
ср -R |
Удалить файл |
rm |
Удалить каталог |
rmdir |
|
rm -R |
Просмотреть файл |
cat |
Переименовать файл |
mv |
Можно задать несколько команд в одной командной строке, разделив их точкой с запятой (;). Перевод строки (нажатие клавиши <Enter>) воспринимается как конец команды. Если команда длинная и ее необходимо перенести на следующую строку, то перед переводом строки ставят обратный слэш (\).
Если ввести команду, а shell не сможет найти программу для этой команды (здесь ``eat''):
/home/stud# eat dirt
eat: command not found
/home/stud#
он выдает сообщение об ошибке, которое объясняет причину невыполнения команды. Вы часто будете видеть это сообщение, если будете вводить имена команд с ошибками.