Санкт-Петербургский Государственный Политехнический Университет
Факультет Технической Кибернетики
Кафедра Компьютерных систем и Программных технологий
Отчёт по НИР
по дисциплине
«Операционные системы реального времени».
Работу выполнила студентка группы 4081/11
Преподаватель:
Санкт-Петербург
2011
НИР СПО РВ
ПРАКТИЧЕСКИЕ ЗАНЯТИЯ
Исходные данные
ПО:
ОС РВ QNX версий 6.3.2 – 6.5.0
IDE QNX Momentics (SDP)
ОС для установки IDE:
- QNX 6.3.2 для локальной и удаленной отладки на реальной или виртуальной кросс-системе,
- Windows и Linux
для удаленной отладки, запуска и выполнения приложений под QNX 6.5.0
или для отладки на виртуальном комплексе(VmWare) приложений под QNX
Оборудование:
1. Программно-аппаратный экспериментальный комплекс, в составе которого инструментальный компьютер (1, 2, 4 процессора), целевой компьютер – аналог инструментального или целевая платформа (без средств ввода/вывода)
2. локальная сеть Qnet
3. доступ в Internet
Темы для исследования
1. Средства IPCPOSIX:
сигналы (функции signal, sigaction), каналы FIFO, очереди сообщений, распределенная память, семафоры
Синхронизация и передача информации между родственными и независимыми процессами и потоками.
1.1. Ненадежные сигналы.
Составьте программу sig_father.c, позволяющую изменить диспозицию сигналов, а именно, установить: - обработчик пользовательских сигналов SIGUSR1 и SIGUSR2; - реакцию по умолчанию на сигнал SIGINT; - игнорирование сигнала SIGCHLD. Процесс-потомок, получив идентификатор родительского процесса, посылает процессу-отцу сигнал SIGUSR1 и извещает об удачной или неудачной отправке указанного сигнала. Остальные сигналы генерируются из командной строки.
Откомпилируйте обе программы: gcc -o sig_father sig_father.c; gcc -o sig_son sig_son.c
Запустите на выполнение исполняемый модуль ./sig_father Далее необходимые сигналы следует посылать с рабочего терминала командой: kill -s <#сигнала> <PID sig_father>.
Father.c
#include <stdio.h>
#include <signal.h>
#include <process.h>
void handler1 (void);
void handler2 (void);
void main ()
{
signal (SIGUSR1, handler1);
signal (SIGUSR2, handler2);
signal (SIGINT, SIG_DFL);
signal (SIGCHLD, SIG_IGN);
spawnl (P_NOWAIT, "son.out", "son", NULL);
while (1)
sleep(1);
}
void handler1 (void)
{
printf ("father %d got signal SIGUSR1; father's father %d\n",getpid(),getppid());
}
void handler2 (void)
{
printf ("father %d got signal SIGUSR2; father's father %d\n",getpid(),getppid());
}
Son.c
#include <stdio.h>
#include <signal.h>
void main ()
{
if (kill(getppid(), SIGUSR1)==-1)
printf ("no signal sent to father %d from son %d\n", getppid(), getpid());
else
printf ("signal SIGUSR1 sent to father %d from son %d\n", getppid(), getpid());
return;
}
Результаты.
$ ./father.out &
[1] 3567666
$ signal SIGUSR1 sent to father 3567666 from son 3571763
father 3567666 got signal SIGUSR1; father's father 2150427
kill -s SIGUSR2 3567666
father 3567666 got signal SIGUSR2; father's father 2150427
$ kill -s SIGINT 3567666
$ ps
PID TTY TIME CMD
2150421 ? 00:00:00 pterm
2150427 ? 00:00:00 sh
1994782 ? 00:00:00 pwm
2023455 ? 00:00:00 shelf
2043936 ? 00:00:00 bkgdmgr
2043937 ? 00:00:00 wmswitch
2400292 ? 00:00:00 helpviewer
2236453 ? 00:00:00 pterm
2236454 ? 00:00:00 sh
2236455 ? 00:00:00 ped
2400296 ? 00:00:00 sh
2400297 ? 00:00:00 sh
2428970 ? 00:00:01 mozserver
2441259 ? 00:00:00 pfm
2441260 ? 00:00:00 pterm
2441261 ? 00:00:00 sh
2441262 ? 00:00:00 ped
3448879 ? 00:00:00 pterm
3448880 ? 00:00:00 sh
3448881 ? 00:00:00 ped
3579954 ? 00:00:00 ps
[1] + Interrupt ./father.out
1.2. Неименованные каналы.
Создайте неименованный канал в файле pipe.c посредством системного вызова pipe(2), который возвращает 2 файловых дескриптора filedes[0] для записи в канал и для чтения из канала filedes[1]. Доступ к дескрипторам канала может получить как процесс, вызвавший pipe() , так и его дочерние процессы.
Используйте следующий фрагмент кода:
#include <stdio.h> #include <unistd.h>
if((err = pipe(filedes)) < 0) { printf("Father : can't create pipe\n"); exit(-1); } printf("Father : pipe is created\n");
Организуйте программу так, чтобы процесс-потомок открывал на чтение произвольный текстовый файл и записывал считываемую из него информацию в созданный неименованный канал. В функции процесса-родителя будет входить считывание из канала на стандартный вывод и в новый текстовый файл. Не забудьте о закрытии дескрипторов после работы с каналом. Откомпилируйте программу gcc -o pipe pipe.c и запустите на выполнение исполняемый модуль ./pipe.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.