
СРВ лабораторная 1
.docxМИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ, СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ
Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего образования
«Московский технический университет связи и информатики»
Кафедра «Интеллектуальные системы в управлении и автоматизации»
Дисциплина «Системы реального времени»
Отчет по лабораторной работе №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