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

lab3

.docx
Скачиваний:
24
Добавлен:
02.01.2023
Размер:
37.18 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра вычислительной техники

Отчет по лабораторной работе №3

по дисциплине «Организация процессов и программирование в среде Linux»

Студент гр.

Преподаватель

Разумовский Г.В.

Тема: Создание и идентификация процессов

Цель работы: изучение и использование системных функций, обеспечивающих порождение и идентификацию процессов.

Задание: Разработать программу, которая порождает 2 потомка. Первый потомок порождается с помощью fork, второй – с помощью vfork с последующей заменой на другую программу. Все 3 процесса должны вывести в один файл свои атрибуты с предварительным указанием имени процесса (например, Предок, Потомок1, Потомок2). Порядок вывода атрибутов в файл должен определяться задержками процессов, которые задаются в качестве параметров программы и выводятся в начало файла. Откомпилировать программу и запустить ее 3 раза с различными сочетаниями задержек.

Программа main.cpp

#include <sys/wait.h>

#include "outputToFile.cpp"

int main(int argc, char *argv[]) {

    if (argc != 5){

        cout << "Неверное кол-во параметров\n";

        return 1;

    }

    char* fileName = argv[1];

    int firstDelay = atoi(argv[2]);

    int thirdDelay = atoi(argv[4]);

    int clone_dif = fork();

   

    if (clone_dif < 0)

        cout << "Can't fork\n";

    else if (clone_dif == 0) { // child1 process

        sleep(firstDelay);

        outputToFile(fileName, "CHILD1");

    }

    else {

        int child_pid_fork = clone_dif;

        clone_dif = vfork();

        if (clone_dif < 0)

            cout << "Can't vfork\n";

        else if (clone_dif == 0){ // child2 process

            if (execl("./child2", fileName, argv[3], NULL) < 0){

                perror("Файл ./child2.so");

                exit(1);

            }

        }

        else{ // parent process

            sleep(thirdDelay);

            outputToFile(fileName, "PARENT");

            if (waitpid(child_pid_fork, 0, 0) < 0){

                cout << "Cannot wait fork\n";

                exit(1);

            }

        }

    }

    return 0;

}

Программа child2.cpp

#include "outputToFile.cpp"

int main(int argc, char *argv[]) {

    ofstream out;

    char* fileName = argv[0];

    int delay = atoi(argv[1]);

    out.open(fileName, ios::app);

    if (out.is_open()) {

        sleep(delay);

        outputToFile(fileName, "CHILD2");

        out<<"Сторонняя программа открыта процессом CHILD2!\n";

        out<< "---------------------------------------------------------\n";

        out.close();

    }

    return 0;

}

Программа outputToFile.cpp

#include <iostream>

#include <fstream>

#include <unistd.h>

using namespace std;

void outputToFile(char* fileName, string processName){

    ofstream out;

    out.open(fileName, ios::app);

    if (out.is_open()) {

        pid_t pid = getpid();

        out<< processName << ": Идентификатор процесса --" << pid << endl;

        out<< processName << ": Идентификатор предка --" << getppid() << endl;

        out<< processName << ": Идентификатор сессии процесса --" << getsid(pid) << endl;

        out<< processName << ": Идентификатор группы процессов --" << getpgid(pid) << endl;

        out<< processName << ": Реальный идентификатор пользователя --" << getuid() << endl;

        out<< processName << ": Эффективный идентификатор пользователя --" << geteuid() << endl;

        out<< processName << ": Реальный групповой идентификатор  --" << getgid() << endl;

        out<< processName << ": Эффективный групповой идентификатор --" << getegid() << endl;

        out<< "---------------------------------------------------------\n";

        out.close();

    }

}

Для того чтобы использовать main.cpp, надо скомпилировать child2.cpp, чтобы сгенерировался исполнительный файл ./child2 и запустился второй процесс во время исполнения.

Распечатка файла text.txt при задержках 1, 2, 3

CHILD1: Идентификатор процесса --2145

CHILD1: Идентификатор предка --2144

CHILD1: Идентификатор сессии процесса --2136

CHILD1: Идентификатор группы процессов --2144

CHILD1: Реальный идентификатор пользователя --1000

CHILD1: Эффективный идентификатор пользователя --1000

CHILD1: Реальный групповой идентификатор --1000

CHILD1: Эффективный групповой идентификатор --1000

---------------------------------------------------------

CHILD2: Идентификатор процесса --2146

CHILD2: Идентификатор предка --2144

CHILD2: Идентификатор сессии процесса --2136

CHILD2: Идентификатор группы процессов --2144

CHILD2: Реальный идентификатор пользователя --1000

CHILD2: Эффективный идентификатор пользователя --1000

CHILD2: Реальный групповой идентификатор --1000

CHILD2: Эффективный групповой идентификатор --1000

---------------------------------------------------------

Сторонняя программа открыта процессом CHILD2!

---------------------------------------------------------

PARENT: Идентификатор процесса --2144

PARENT: Идентификатор предка --2136

PARENT: Идентификатор сессии процесса --2136

PARENT: Идентификатор группы процессов --2144

PARENT: Реальный идентификатор пользователя --1000

PARENT: Эффективный идентификатор пользователя --1000

PARENT: Реальный групповой идентификатор --1000

PARENT: Эффективный групповой идентификатор --1000

---------------------------------------------------------

Распечатка файла text.txt при задержках 3, 2, 1

PARENT: Идентификатор процесса --2149

PARENT: Идентификатор предка --2136

PARENT: Идентификатор сессии процесса --2136

PARENT: Идентификатор группы процессов --2149

PARENT: Реальный идентификатор пользователя --1000

PARENT: Эффективный идентификатор пользователя --1000

PARENT: Реальный групповой идентификатор --1000

PARENT: Эффективный групповой идентификатор --1000

---------------------------------------------------------

CHILD2: Идентификатор процесса --2151

CHILD2: Идентификатор предка --2149

CHILD2: Идентификатор сессии процесса --2136

CHILD2: Идентификатор группы процессов --2149

CHILD2: Реальный идентификатор пользователя --1000

CHILD2: Эффективный идентификатор пользователя --1000

CHILD2: Реальный групповой идентификатор --1000

CHILD2: Эффективный групповой идентификатор --1000

---------------------------------------------------------

Сторонняя программа открыта процессом CHILD2!

---------------------------------------------------------

CHILD1: Идентификатор процесса --2150

CHILD1: Идентификатор предка --2149

CHILD1: Идентификатор сессии процесса --2136

CHILD1: Идентификатор группы процессов --2149

CHILD1: Реальный идентификатор пользователя --1000

CHILD1: Эффективный идентификатор пользователя --1000

CHILD1: Реальный групповой идентификатор --1000

CHILD1: Эффективный групповой идентификатор --1000

---------------------------------------------------------

Видно, что порядок выводов родителя и потомков соответствует временным задержкам.

Санкт-Петербург

2022

Соседние файлы в предмете Программирование в среде Linux