Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПР15.doc
Скачиваний:
2
Добавлен:
11.08.2019
Размер:
75.26 Кб
Скачать

Практическое занятие №15 Организация процессов в qnx

Цель – ознакомиться со способами организации дочерних процессов, предоставляемыми системой QNX

Системой предоставляется пять основных способов организации процессов:

  • разветвление текущего процесса на процесс-родитель и процесс потомок (системный вызов fork);

  • подмена выполняемой процессом задачи (системный вызов exec);

  • порождение независимого процесса (системный вызов spawn);

  • выполнение системной утилиты QNX (системный вызов system);

  • (системный вызов vfork)

Более подробная информация, включающая в себя синтаксис команд, их описание и примеры применения предоставлена в качестве справочного материала.

1. Методические указания по выполнению практической работы

В предоставляемом примере задача по ведению базы данных разбита на три модуля:

  • модуль input.o производит ввод данных в базу данных (база данных имеет произвольный формат);

  • модуль output.o позволяет производить просмотр содержимого базы данных;

  • модуль process.o производит обработку данных, содержащихся в базе данных;

  • модуль main.o является основной программой, из которой происходит вызов ранее описанных модулей.

Для большей наглядности рекомендуется каждый из составных модулей снабдить средствами вывода идентификатора текущего процесса.

Информационная схема, описывающая направление информационных потоков приведена на рисунке 1.

На рисунке 2 представлена блок-схема алгоритма работы основной программы, поскольку именно в ней содержатся системные вызовы дочерних процессов.

Рис. 1. Направление информационных потоков между модулями

1.1. Файл main.O

#include<fcntl.h>

#include<sys/stat.h>

#include<errno.h>

#include<semaphore.h>

#include<stdio.h>

#include<stdlib.h>

#include<iostream.h>

#include<spawn.h>

int error; //hranenie oshibki

int child_pid; //identifikator dochernego processa;

int main()

{cout<<"Identifikator roditelskogo processa raven \n"<< getpid()<<endl;

fflush(stdout);

//Docherniy process v dannom primere ne vipolnyaet nikakih deystviy

if(child_pid=fork())

{cout<<"\n Identifikator roditelskogo processa raven \n"<< getpid()<<endl;

//vipolnenie sistemnoy utiliti ls (chtenie oglavleniya kataloga) posredstvom funkcii system

system("ls");

//roditelskiy process dogidaetsya zaversheniya vipolneniya zapuskaemoy programmi

cout<<"\n Vipolnenenie vneshney programmi posredstvom funkcii spawnl \n"<<endl;

//Obrabotka vozmognih oshibok

if(spawnl(P_WAIT, "input", "input", NULL, NULL)==-1)

cout<<"Voznikla oshibka!"<<endl;//strerror(error));

//roditelskiy process ne dogidaetsya zaversheniya vipolneniya zapuskaemoy programmi

cout<<"\n Vipolnenenie vneshney programmi posredstvom funkcii spawnl \n"<<endl;

//Obrabotka vozmognih oshibok

if(spawnl(P_WAIT, "output", "output", NULL, NULL)==-1)

cout<<"Voznikla oshibka!"<<endl;//strerror(error));

cout<<"\n Vipolnenenie vneshney programmi posredstvom funkcii execl \n"<<endl;

if(execl("process","process", NULL)==-1)

cout<<"Voznicla oshibka!"<<endl;//strerror(error));

cout<<"\nEta stroka ne budet poyavlyatsya na ekrane!"<<endl;}

else {cout<<"Identifikator dochernego processa raven: \n"<<getpid()<<endl;}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]