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