- •Министерство образования и науки Украины
- •Практическое занятие №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. Содержание отчёта
1.3. Ошибки, связанные с именами файлов
Функции, которые принимают как аргументы имена файлов обычно, обнаруживают эти errno - условия ошибки в отношении синтаксиса имени файла:
EACCES
процесс не имеет права поиска для каталога - компонента имени файла.
ENOENT
Об этой ошибке сообщается, когда файл, вызванный как каталог не существует, или когда компонент есть символическая связь, чей выходной файл не существует.
ENOTDIR
Файл, который вызван как, каталог существует, но это не каталог.
В дополнение к обычным синтаксическим ошибкам имени файла следующие errno условия ошибки определены для этой функции:
EACCES
Файл существует, но не читаем/перезаписываем как запрошено аргументом flags.
EEXIST
O_CREAT и O_EXCL - установлены, а именованный файл уже существует.
EISDIR
Аргумент flags задает доступ для записи, а файл - каталог.
EMFILE
Процесс имеет слишком много открытых файлов.
ENOENT
Именованный файл не существует, но O_CREAT не определен.
ENOSPC
Каталог или файловая система, которая содержала бы новый файл, не может быть расширена, т. к. там не осталось дискового пространства.
1.4. Доступ к файлу
Функции, реализующие системные вызовы ввода/вывода QNX, следуюшие:
#include<unistd.h>
ssize_t write(int fd, void *buf, size_t nbyte);// Эти функции
ssize_t read(int fd, void *buf, size_t nbyte);// объявлены в файле
off_t lseek(int fd, off_t offset, int whence);// 'unistd.h '
off_t tell(int fd);
int close(intfd);
В представленных функциях аргумент fd является дескриптором открытого файла.
Функция write() записывает в файл nbyte байт из буфера buf и возвращает количество записанных байт.
Функция read() читает из файла nbyteбайт и записывает их в буфер buf, возвращает количество считанных.
Функция lseek()смещает указатель позиции файла на величину offsetотносительно указанной базы whence, которая может принимать значения: SEEK_SET– от начала файла, SEEK_END– от конца файла, SEEK_CUR– от текущей позиции. Возвращает новое значение позиции.
Функция tell() возвращает текущее значение позиции файла (указателя файла).
Функция close() закрывает файл и возвращает нулевое значение. Все функции в случае ошибки возвращают -1 и устанавливают errno.
Тип данных: ssize_t
Этот тип данных используется для представления размеров блоков, которые могут быть прочитаны или записаны одиночной операцией. Он подобен size _t, но должен быть знаковым типом.
Функция: ssize_t read (int filedes, void *buffer, size_t size)
Функция read читает до size байтов из файла с описателем filedes, сохраняя результаты в буфере. (Это - не обязательно символьная строка и не имеется никакого добавленного пустого символа завершения.)
Возвращаемое значение - число байтов фактически прочитанных. Оно может быть меньше чем size.
Нулевое значение указывает конец файла (за исключением того, если значение аргумента size является также нулем). Это не является ошибкой.
Если read возвращает по крайней мере один символ, не имеется никакого способа, которым Вы можете узнать, был ли конец файла достигнут. Но если Вы достигали конца, следующий read возвратит нуль.
В случае ошибки read возвращает -1. Следующие errno условия ошибки определены для этой функции:
EAGAIN
Обычно, когда никакой ввод недоступен, read ждет какого-нибудь ввода. Но если установлен флаг O_NONBLOCK, read возвращается немедленно не читая никаких данных, и сообщает эту ошибку.
EBADF
Filedes аргумент - не допустимый описатель файла.
Функция read - основной примитив для всех функций, которые читают из потоков, типа fgetc.
Функция: ssize_t write (int filedes, const void *buffer, size_t size)
Функция write пишет до size байтов из буфера в файл с описателем filedes. Данные в буфере - не обязательно символьная строка и вывод пустого символа подобен любому другому.
Возвращаемое значение - число байтов, фактически записанных. Это - обычно size, но могло бы быть и меньшее количество. В случае ошибки, write возвращает -1. Следующие errno условия ошибки определены для этой функции:
EAGAIN
Обычно, write блокируется до завершения операции записи. Но если для файла установлен O_NONBLOCK флаг, она возвращается немедленно, не производя записи любых данных, и сообщает эту ошибку.
EBADF
Аргумент Filedes - не допустимый дескриптор файла.
Функция write - основной примитив для всех функций записи в поток, типа fputc.
Установка Файловой позиции Дескриптора.
Точно как Вы можете устанавливать файловую позицию потока функцией fseek, Вы можете устанавливать файловую позицию дескриптора функцией lseek. Она определяет позицию в файле для следующей операции read или write. См. Раздел 7.15 [Позиционирование Файла], для подробной информации относительно файловой позиции и что это означает.
Для получения текущего значения файловой позиции из описателя, используйте lseek (desc, 0, SEEK_CUR).
Функция: off_t lseek (int filedes, off_t offset, int whence)
Тип данных: оff_t - арифметический тип данных, используемый, чтобы представить размеры файла.
Функция lseek используется, чтобы изменить файловую позицию файла с описателем filedes. Аргумент whence определяет, как смещение должно интерпретироваться и может быть одной из символических констант SEEK_SET, SEEK_CUR, или SEEK_END.
SEEK_SET
Определяет, что whence - число символов от начала файла.
SEEK_CUR
Определяет, что whence - число символов от текущей файловой позиции. Этот число может быть положительно или отрицательно.
SEEK_END
Определяет, что whence - число символов с конца файла. Отрицательное число определяет позицию внутри текущего тела файла; положительное число определяет позицию после текущего конца. Если Вы устанавливаете позицию после текущего конца, и фактически записываете данные, Вы расширяете файл нулями до этой позиции.
Возвращаемое значение lseek - обычно возникающая в результате файловая позиция, измеряемая в байтах от начала файла. Вы можете использовать это средство вместе с SEEK_CUR для чтения текущей файловой позиции.
Вы можете устанавливать файловую позицию после текущего конца файла. Это делает файл больше; lseek никогда не изменяет файл. Но последующий вывод в ту позицию расширит файла.
Если файловая позиция не может быть изменена, или операция выполняется некоторым недопустимым способом, lseek возвращает значение -1. Следующие errno условия ошибки определены для этой функции:
EBADF
Filedes - не допустимый описатель файла.
EINVAL
Значение аргумента whence не допустимо, или возникающее в результате смещение файла не допустимо.
Функция lseek - основной примитив для fseek, ftell и rewind функций, которые функционируют на потоках вместо описателей файла.
Дублирование дескриптора файла.
Вы можете иметь многократные описатели для того же самого файла, если Вы открываете файл больше чем один раз, или если Вы дублируете описатель с dup.
Можно создать копию дескриптора открытого файла такую, что новый дескриптор, будет иметь следующие общие свойства с исходным дескриптором файла:
тот же открытый файл или устройство;
тот же указатель файла (это означает, что изменение одного указателя файла влечет за собой и изменение другого);
тот же режим доступа (чтение, запись, чтение/запись).
Для получения копии используются функции:
#include<unistd.h>
int dup(int fd);
int dup2(int fd, int fd2);
При успешном выполнении dup() возвращает новый дескриптор файла - целое неотрицательное число. При успешном выполнении функция dup2() делает дескриптор fd2 копией дескриптора fd и возвращает 0. Если уже имеется открытый файл с дескриптором fd2, то он предварительно закрывается. В случае ошибки обе функции возвращают -1 и устанавливается errno.
Дескрипторы, которые исходят из отдельных обращений open, имеют независимые файловые позиции; использование lseek на одном дескрипторе не производит никакого эффекта на другой.
Например,
{
int d1, d2;
char buf[4];
d1 = open ('foo', O_RDONLY);
d2 = open ('foo', O_RDONLY);
lseek (d1, 1024, SEEK_SET);
read (d2, buf, 4);
}
будет читать первые четыре символа файла 'foo'. (Код с обнаружением ошибок, необходимый для реальной программы был опущен здесь для краткости.)
Напротив, описатели, сделанные дублированием совместно используют общую файловую позицию с первоначальным описателем, который был дублирован. Изменение файловой позиции одного из дубликатов, включая чтение или запись данных, воздействует на все из них. Таким образом, например,
{
int d1, d2, d3;
char buf1[4], buf2[4];
d1 = open ('foo', O_RDONLY);
d2 = dup (d1);
d3 = dup (d2);
lseek (d3, 1024, SEEK_SET);
read (d1, buf1, 4);
read (d2, buf2, 4);
}
будет читать четыре символа, начиная с 1024-го символа 'foo', и еще четыре символа, начиная с 1028-го символа.
Функция: int close (int filedes)
Функция закрывает дескриптор файла filedes. Закрытие файла имеет следующие последствия:
Описатель файла освобожден.
Любые блокировки записи, принадлежащие процессу на файле разблокируются.
Нормальное возвращаемое значение - 0; значение -1 возвращается в случае ошибки.
Следующие errno условия ошибки определены для этой функции:
EBADF Filedes аргумент - не допустимый дескриптор файла.