Курило БСТ2001 ОС лаба 3
.docxМинистерство цифрового развития, связи и массовых коммуникаций Российской Федерации
Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего образования
«Московский технический университет связи и информатики»
Кафедра Системного программирования
Лабораторная работа №3
по дисциплине
«Операционные системы»
Выполнила студентка:
группы БСТ2001
Курило А. А.
Проверила:
ассистентка Алексанян Д. А.
Москва 2022
Цель работы
В ходе работы мы должно разработать приложение для создания процессов и потоков с помощью языка программирования С.
Задание
Изучить теоретическую часть лабораторной работы.
Написать программу, создающую два дочерних процесса с использованием двух вызовов fork(). Родительский и два дочерних процесса должны выводить на экран свой pid и pid родительского процесса и текущее время в формате: часы:минуты:секунды. Используя вызов system(), выполнить команду ps -x в родительском процессе. Найти свои процессы в списке запущенных процессов. Первый дочерний процесс, помимо указанного вывода, также выводит информацию по варианту (табл.1), используя вызов. Второй дочерний процесс после вывода основной информации должен быть замещен задачей, создающей два дочерних потока. В соответствии с моим вариантом (11), нужно вывести таблицу маршрутизации хоста.
Написать программу, создающую два дочерних потока. Родительский процесс и два дочерних потока должны выводить на экран свой id и pid родительского процесса и текущее время в формате: часы:минуты:секунды.
Выполнение
На рисунке 1 представлена реализация первого задания на языке программирования С.
Рисунок 1 – реализация
На рисунке 2 представлена реализация второго задания на языке программирования С.
Рисунок 2 – результат выполнения
На рисунке 3 представлено выполнение программ и результат.
Рисунок 3 – результат выполнения
Листинг программы
1 задание:
#include <time.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
int main () {
pid_t process1, process2;
time_t t;
char str[10];
process1 = fork();
if (process1 == 0) {
printf("Это 1 дочерний процесс, его pid = %d\n", getpid());
printf("1 дочерний. А pid его родительского процесса = %d\n", getppid());
t = time(NULL);
strncpy(str, ctime(&t)+11, 8);
printf("Сейчас: %s\n", str);
system("route");
printf("\n");
} else {
process2 = fork();
if (process2 == 0) {
printf("Это 2 дочерний процесс, его pid = %d\n", getpid());
printf("2 дочерний. А pid его родительского процесса = %d\n", getppid());
t = time(NULL);
strncpy(str, ctime(&t)+11, 8);
printf("Сейчас: %s\n", str); execl("max", NULL);
} else {
printf("Это родительский процесс его pid = %d\n", getpid());
printf("А pid его родительского процесса = %d\n", getppid());
t = time(NULL);
strncpy(str, ctime(&t)+11, 8);
printf("Сейчас: %s\n", str);
printf("Запущенные процессы\n");
system("ps -x | tail -n 11");
}
}
return 0;
}
2 задание:
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <stdlib.h> #include <string.h> #include <pthread.h>
void *ThreadFunc(void *vargp);
int main() {
pthread_t first_thread, second_thread;
int thread1 = 1, thread2 = 2;
pthread_create(&first_thread, NULL, ThreadFunc, &thread1);
pthread_create(&second_thread, NULL, ThreadFunc, &thread2);
pthread_join(first_thread, NULL);
pthread_join(second_thread, NULL);
return 0;
}
void *ThreadFunc(void *vargp) {
time_t t;
char str[10];
printf("\n This %d child thread, his id = %ld\n", *(int*)vargp, (long)pthread_self());
printf("Pid of it`s parent process = %d\n");
t = time(NULL);
strncpy(str, ctime(&t)+11, 8);
printf("Time: %s\n\n", str);
return NULL;
}