- •1 Системы реального времени. Основные понятия и определения
- •2 Программирование в ос семейства unix (linux)
- •2.1 Программирование на shell. Использование командных файлов
- •Процедура языка shell
- •Структура команд
- •В таблице 2.1 представлены некоторые средства группировки команд, которые могут быть использованы при создании командных файлов на shell.
- •Перенаправление данных
- •Shell-переменные
- •Структурные операторы shell Оператор цикла for
- •Условный оператор if
- •Команда test
- •Оператор цикла while
- •Оператор цикла until
- •Оператор выбора case
- •Отладка процедур языка shell
- •Практическое задание
- •2.2 Программирование в ос семейства unix с использованием awk»
- •Практическое задание «Программирование с использованием awk»
- •2.3 Программирование в ос с использованием си»
- •Системный вызов ореn
- •Системный вызов сrеаt
- •Системный вызов read
- •Системный вызов write
- •Системный вызов сlose
- •Практическое задание
- •Системный вызов fork
- •Системный вызов wait
- •Системный вызов exit
- •Системные вызовы ехес1, ехес1е, ехесv и ехесvе
- •Системный вызов getpid
- •Системные вызовы getgid, getegid
- •Системные вызовы getuid, geteuid
- •Системный вызов setgid
- •Системный вызов setuid
- •Системный вызов nice
- •Практическое задание «си. Управление процессами»
- •2.3.3 Управление оперативной памятью
- •Указатели на простые переменные
- •Массивы и указатели на массивы
- •Указатели на структуры
- •Динамическое распределение оп
- •Практическое задание
- •3 Компиляция, компоновка и загрузка в Linux
Практическое задание
«СИ-функции работы с файлами»
1. Написать программу на СИ++, выполнение которой позволяет:
создать файл,
считать данные с клавиатуры в буфер;
поместить данные из буфера в созданный файл;
закрыть этот файл;
открыть этот файл и вывести его содержимое на экран монитора, закрыть файл.
2. Написать программу на СИ++, выполнение которой позволяет:
проверить наличие файла на диске;
если файл существует, открыть его. Если файл не существует создать его;
считать данные с клавиатуры в буфер;
поместить данные из буфера в созданный файл;
закрыть этот файл.
Отобразить содержимое файла на экране.
3. Написать программу на СИ++, выполнение которой позволяет:
проверить наличие двух файлов на диске;
если файлы существуют, открыть их. Если файлы не существуют, создать их, ввести данные;
перенаправить информацию из одного файла в другой;
закрыть файлы.
Отобразить содержимое файлов на экране.
2.3.2 СИ-функции управления процессами
Цель: изучение системных функций, обеспечивающих управление процессами в среде ОС семейства UNIХ: их создание, удаление, изменение приоритетности и т.п.
Основные понятия
Системный вызов fork
Системный вызов fork (порождение нового процесса) имеет следующий формат:
pid = fork()
int pid;
Системный вызов fork служит для создания нового процесса. Новый процесс (процесс-потомок) является полной копией процесса-предка, за исключением того, что процесс-потомок имеет свой уникальный идентификатор процесса (РID). Поскольку новый процесс сам может выступать в качестве порождающего, его идентификатор процесса-предка (РРID), естественно, отличается от соответствующего идентификатора породившего его процесса.
Новый процесс имеет собственную копию таблицы дескрипторов открытых файлов, но эти дескрипторы ссылаются на те же самые файлы, что и дескрипторы процесса-предка, и имеют с ним общие указатели позиций чтения/записи. Так, при выполнении операции 1sееk в порожденном процессе, может измениться и позиция чтения/записи файла в процессе-предке. Это свойство, в частности, используется командными языками SН СSН для переопределения файлов стандартного ввода/вывода и организации конвейеров команд. Счетчики использованных ресурсов порожденного процесса инициализируются нулевыми значениями. В случае успешного завершения, системный вызов fork возвращает значение 0 порожденному процессу и идентификатор нового процесса - породившему. При неудачном завершении вызова возвращается значение -1.
Системный вызов wait
Системный вызов wait (ожидание завершения процесса-потомка) имеет следующий формат:
pid = wait (status)
int pid;
int *status;
pid = wait(0)
int = pid;
Системный вызов wait задерживает вызвавший его процесс до поступления сигнала или завершения одного из порожденных им процессов. Если какой-нибудь порожденный процесс завершился в период времени с момента последней выдачи команды wait производится немедленный возврат. Если порожденные процессы отсутствуют, производится немедленный возврат с установкой бита ошибки (соответственно, с возвратом -1). При нормальном возврате, системный вызов wait получает идентификатор завершившегося порожденного процесса. В случае нескольких порожденных процессов нужно произвести несколько вызовов wait , чтобы отследить признаки завершения всех порожденных процессов. При успешном завершении вызова wait , значение status всегда не равно нулю и содержит код возврата и статус завершения порождённого процесса. Если порождающий процесс завершается, не ожидая своих потомков, их наследует стартовый процесс (РID=1). Вызов автоматически перезапускается, если процесс получает сигнал во время ожидания своих потомков. При нормальном завершении выдается идентификатор завершившегося процесса. В случае ошибки - значение -1 и код ошибки в переменной errnо.
