Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

СРВ лабораторная 1

.docx
Скачиваний:
1
Добавлен:
15.01.2025
Размер:
250.9 Кб
Скачать

МИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ, СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ

Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего образования

«Московский технический университет связи и информатики»

Кафедра «Интеллектуальные системы в управлении и автоматизации»

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

Отчет по лабораторной работе №1

Выполнил:

студент группы БСТ2104

Станишевский И.А.

Проверил: Карпов А.В.

Москва, 2024 г.

Содержание

1 Цель 3

2 Выполнение лабораторной работы 3

1 Цель 3

2 Выполнение лабораторной работы 3

1 Цель

Получение навыков практической работы в операционной системе реального времени QNX Neutrino. Изучение основных способов создания и порождения процессов и потоков в операционной системе QNX.

2 Выполнение лабораторной работы

Проиллюстрируем, каким образом программа может получить информацию о значении своих атрибутов.

#include<stdlib.h> //стандартная библиотека

#include<sys/resource.h>// файл с идентификацией ресуpсов

#include <stdio.h>//для функции ввод вывод, ссылка на файлы

int main(int argc, char *argv[])

{

printf("\process Information: \n");

// argv[0]- названия файла

printf("Process name = \t\t%s\n", argv[0]);

// %d - десятичное число

printf("Process ID (PID) = \t\t<%d>\n", getpid());

printf("Parent's process ID (PID) = \t<%d>\n", getpid());

//приоритет текущего потока

printf("Process priority = \t< %d >\n", get prio(0));

return EXIT_SUCCESS;

}

Рисунок 1 – Результат работы программы process.c

Проиллюстрируем, каким образом программа может получить информацию о значении своих атрибутов.

#include <sys/wait.h>

#include<stdlib.h> // стандартная библиотека

#include<stdio.h> // функции ввода/вывода, ссылка на файлы

#include<sys/resource.h> // идентификация ресурсов

int main (int argc, char *argv[]){

int rc = system("Is");

if (rc == -1) printf("shell could not be run");

else {

printf("result of running command is ");

WEXITSTATUS(rc);

}

return EXIT_SUCCESS;

}

Рисунок 2 – Результат работы программы syst.c

Посмотрим, как применяют функцию fork() на примере файла fork.c. В этом примере видно, что функция fork() возвращает целое число, которое в родительском процессе равно нулю, а в дочернем - идентификатору процесса:

#include<stdlib.h> /*стандартная библиотека*/

#include<stdio.h> // функции ввода/вывода, ссылка на файлы

#include<sys/resource.h> /*идентификация ресурсов*/

int main(int argc, char *argv[]) {

pid_t pid;

char *Prefix;

//выделение памяти для массива символов

Префикс = (char*) malloc (sizeof(char));

pid = fork(); // создание нового процесса

if (pid == 0) sprintf (Prefix, "Child:"); // если процесс дочерний

else sprintf (Prefix, "Parent:");

printf("%s Process name = %s\n",Prefix, argv[0]);

printf("%s Process ID (PID) = %d>\n",Prefix, getpid());

printf("%s Parent's process ID (PID) = %d>\n", Prefix, getppid());

return EXIT_SUCCESS;

}

Рисунок 3 – Результат работы программы fork.c

На примере vfork.c проиллюстрируем порождение нового процесса с помощью комбинации вызовов vfork() и exec():

#include<stdlib.h> /*стандартная библиотека для памяти*/

#include<stdio.h>// для ссылки на файл и ввод вывод

#include<process.h> // управление процессами

#include<sys/resource.h> //pecурасми

int main(int argc, char *argv[]) {

pid_t pid;

pid = vfork(); // создание нового процесса

if (pid == 0) // если дочерний процесс

{

execlp("./process", "process", NULL); //замена текущего образа на новый

perror("Child");

exit ( EXIT_FAILURE);

}

// ожидание завершение процесса

/*О - завершение любого дочернего процесса

NULL - без возвращения

О - статус завершения не будет изменен*/

waitpid(O, NULL,O);

printf("Parent's process ID = %d\n",getpid());

printf("Parent's parent's process ID = %d\n", getpid());

return EXIT_SUCCESS;

}

Рисунок 4 – Результат работы программы vfork.c

В файле spawn.с представлен пример наиболее простого и быстрого способа порождения нового процесса:

#include<stdlib.h> /*управление памятью*/

#include<stdio.h> // ввод вывод

#include<process.h> //управление процессом

int main(int argc, char *argv[]) {

// P_WAIT - флаг, процесс ожидает завершение текущего процесса

spawnl(P_WAIT, "./process", "process", NULL);

printf("Parent's process ID = %d\n",getpid());

printf("Parent's parent's process ID = %d\n", getpid());

return EXIT_SUCCESS;

}

Рисунок 5 – Результат работы программы spawn.c

В файле thread.с представлен пример порождения нового процесса и его потоков:

#include<stdlib.h> /*управление памятью*/

#include<stdio.h> // управление вводов выводом и ссылка на

#include<pthread.h> // работа с потоками

файл

#include<sys/neutrino.h> //функции нейтрино

pthread_t thread_id1;

pthread_t thread_id2;

// функция для первого потока

void * long_thread1(void * notused)

{

int n;

for(n=0; n<5;n++) {

printf("This is first thread, TID %d - N repeat %d \n", pthread_self(),n);

sleep(2);

}

}

void * long_thread2(void * notused) {

int m;

for(m=0; m<5;m++) {

printf("This is second thread, TID %d - N repeat %d \n", pthread_self(),m);

sleep(1);

}

}

int main(void) {

printf("PID %d \n",getpid());

//создание двух потоков

//

& - ссылка на адресс переменной памяти

// NULL - использование стандартных атрибутов

// функция кот выполняется в потоке 1

// NULL - пармтер для передачи функции

pthread_create(&thread_id 1, NULL, long_thread1, NULL);

pthread_create(&thread_id2, NULL, long_thread2, NULL);

// ожидание завершения потоков

pthread_join(thread_id1, NULL);

pthread_join(thread_id2, NULL);

sleep(40);

return(1);

}

Рисунок 6 – Результат работы программы thread.c

Соседние файлы в предмете Системы реального времени