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

ОСлаб2_Мячина_БФИ2203

.docx
Скачиваний:
0
Добавлен:
02.08.2026
Размер:
498 Кб
Скачать

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

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

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

(МТУСИ)

Кафедра «Системное программирование»

Лабораторная работа №2

Вариант 18

«ПРОЦЕССЫ И ПОТОКИ В ОС GNU/LINUX»

по дисциплине «Операционные системы»

Выполнила:

студент группы БФИ2203

Мячина Лада Андреевна

Проверила:

Старший преподаватель

Алексанян Диана Ашотовна

Москва, 2024 г.

Цель работы: изучение системных средств порождения и взаимодействия процессов и потоков в ОС GNU/LINUX.

Задание:

1. Изучить теоретическую часть лабораторной работы.

2. Написать программу, создающую два дочерних процесса с использованием двух вызовов fork(). Родительский и два дочерних процесса должны выводить на экран свой pid и pid родительского процесса и текущее время в формате: часы:минуты:секунды. Используя вызов system(), выполнить команду ps -x в родительском процессе. Найти свои процессы в списке запущенных процессов. Первый дочерний процесс, помимо указанного вывода, также выводит статистики использования подсистемы ввода-вывода, используя вызов system(). Второй дочерний процесс после вывода основной информации должен быть замещен задачей, создающей два дочерних потока (п.3 задания). 3. Написать программу, создающую два дочерних потока. Родительский процесс и два дочерних потока должны выводить на экран свой id и pid родительского процесса и текущее время в формате: часы:минуты:секунды.

Ход работы:

Написала программы processes_program.cpp и threads_program.cpp для выполнения задания. Код находится в листинге 1 и листинге 2.

Листинг 1. Код программы, который находится в файле processes_program.cpp

#include <iostream>

#include <unistd.h>

#include <sys/types.h>

#include <sys/wait.h>

#include <ctime>

#include <cstdlib>

void printTime() {

time_t now = time(0);

tm *ltm = localtime(&now);

std::cout << "Current time: " << ltm->tm_hour << ":" << ltm->tm_min << ":" << ltm->tm_sec << std::endl;

}

int main() {

pid_t pid1, pid2;

// создание первого дочернего процесса

pid1 = fork();

if (pid1 == 0) {

// дочерний процесс 1

std::cout << "Child process 1, PID: " << getpid() << ", PPID: " << getppid() << std::endl;

printTime();

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

system("iostat");

exit(0);

}

// создание второго дочернего процесса

pid2 = fork();

if (pid2 == 0) {

// дочерний процесс 2

std::cout << "Child process 2, PID: " << getpid() << ", PPID: " << getppid() << std::endl;

printTime();

// Замещение процессом, который создаёт потоки

execlp("./threads_program", static_cast<char *>(nullptr));

// Если execl не сработает, выведем ошибку

perror("execlp");

exit(1);

}

// родительский процесс

std::cout << "Parent process, PID: " << getpid() << std::endl;

printTime();

// выполнение команды ps -x для вывода списка процессов

system("ps -x");

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

wait(nullptr);

wait(nullptr);

return 0;

}

Листинг 2. Код программы, который находится в файле threads_program.cpp:

#include <iostream>

#include <pthread.h>

#include <ctime>

#include <unistd.h>

void printTime() {

time_t now = time(0);

tm *ltm = localtime(&now);

std::cout << "Current time: " << ltm->tm_hour << ":" << ltm->tm_min << ":" << ltm->tm_sec << std::endl;

}

void* threadFunction(void* arg) {

// вывод id потока, pid родительского процесса и текущее время

std::cout << "ID stream: " << pthread_self() << ", PID parent process: " << getpid() << std::endl;

printTime();

pthread_exit(nullptr);

}

int main() {

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

pthread_t thread1, thread2;

std::cout << "The parent process (for stream), PID: " << getpid() << std::endl;

printTime();

pthread_create(&thread1, nullptr, threadFunction, nullptr);

pthread_create(&thread2, nullptr, threadFunction, nullptr);

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

pthread_join(thread1, nullptr);

pthread_join(thread2, nullptr);

return 0;

}

Для компиляции были использованы команды:

g++ -o processes_program processes_program.cpp

g++ -o threads_program threads_program.cpp -pthread (-pthread - параметр указывает компилятору, что программа будет использовать многопоточность)

Результат выполнения программы представлен на рисунках 1-3.

Рисунок 1 – Результат выполнения программы (1)

Рисунок 2 – Результат выполнения программы (2)

Рисунок 3 – Результат выполнения программы (3)

Вывод

В результате работы были приобретены навыки работы с процессами и потоками.