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

Курило БСТ2001 ОС лаба 3

.docx
Скачиваний:
9
Добавлен:
02.10.2023
Размер:
343.46 Кб
Скачать

Министерство цифрового развития, связи и массовых коммуникаций Российской Федерации

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

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

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

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

по дисциплине

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

Выполнила студентка:

группы БСТ2001

Курило А. А.

Проверила:

ассистентка Алексанян Д. А.

Москва 2022

  1. Цель работы

В ходе работы мы должно разработать приложение для создания процессов и потоков с помощью языка программирования С.

  1. Задание

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

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

  • Написать программу, создающую два дочерних потока. Родительский процесс и два дочерних потока должны выводить на экран свой id и pid родительского процесса и текущее время в формате: часы:минуты:секунды.

  1. Выполнение

На рисунке 1 представлена реализация первого задания на языке программирования С.

Рисунок 1 – реализация

На рисунке 2 представлена реализация второго задания на языке программирования С.

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

На рисунке 3 представлено выполнение программ и результат.

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

  1. Листинг программы

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;

}