Операционные системы реального времени. Программно-аппаратный экспериментальный комплекс, в составе которого инструментальный компьютер

Страницы работы

Содержание работы

Санкт-Петербургский Государственный Политехнический Университет

Факультет Технической Кибернетики

Кафедра Компьютерных систем и Программных технологий

Отчёт по НИР

по дисциплине

«Операционные системы реального времени».

Работу выполнила студентка группы 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.

Похожие материалы

Информация о работе