lab3
.docxМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра вычислительной техники
Отчет по лабораторной работе №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