ОС UNIX

Заказать уникальную курсовую работу
Тип работы: Курсовая работа
Предмет: Linux, Unix
  • 43 43 страницы
  • 11 + 11 источников
  • Добавлена 17.02.2013
1 000 руб.
  • Содержание
  • Часть работы
  • Список литературы
  • Вопросы/Ответы
Содержание
Введение
Цели и задачи курсовой работы
Теоретическая часть
История ОС UNIX
Структура ОС UNIX
Файловая система ОС UNIX
Системные вызовы для работы с файлами и каталогами
Практическая часть
Выбор системы и среды программирования
Выбор необходимых операций
Реализация приложения
Заключение
Список литературы
Приложения
Приложение 1. Код написанного приложения
file.h
Folder.h
main.cpp
Приложение 2. Результат работы программы

Фрагмент для ознакомления

Все объекты внутри каталога – это различные файлы, и мы для них вызываем уже описанную функцию, которая выводит информацию о файле на экран, передавая в эту функцию имя текущего файла. Когда вывели на экран все содержимое каталога, то закрываем его и освобождаем системные переменные.
Рассмотрим еще одну функцию deldir(). Эта функция удаления каталога. Использовать системный вызов rmdir() нельзя, т.к. удаляемый каталог должен быть пустым. Наша функция deldir() удаляет каталог, в котором находятся несколько файлов, к сожалению содержать другие вложенные каталоги удаляемый каталог не должен. Для решения такой задачи нужно немного переписать код. Код функции deldir() приведен ниже, эта функция принимает в себя имя удаляемого каталога.
int deldir(char * dirname)
{
//Определяем структуру в которой будет записан каталог
DIR * dir_ptr;
struct dirent * direntp;

//Провеярем существует ли этот каталог и можно ли его открыть
if ((dir_ptr = opendir(dirname)) == NULL)
{
//Если открыть нельзя то выводим сообщение об ошибке...
fprintf(stderr, "ls: Can't open %s\n", dirname);
}
else
{
//Если каталог удалось открыть, то выводим список удаляемых файлов
printf("List Delete Files --%s-- Directory!!!\n", dirname);
//Пока не пройдем все объекты каталога
while ((direntp = readdir(dir_ptr)) != NULL)
{
//проверяем чтобы это были файлы, системные файлы мы удалять не будем
if (direntp->d_name[0] != '.')
{
//Если файл не системный, то удаляем его
printf("Need delete file --- %s\n", direntp->d_name);
delfile(direntp->d_name);
}
}
//Закрываем каталог
closedir(dir_ptr);
//Удаляем каталог, данная операция нормально отработает если в каталоге нет файлов кроме "." и ".."
rmdir(dirname);
}
} Работа этой функции похожа на работу функции ls(), мы проходим все содержимое каталога и удаляем имеющиеся файлы. Для этого мы сначала определяется переменная системного типа DIR. Кроме того определяется переменная системного типа dirent. Открываем каталог при помощи системного вызова opendir(), при этом проверяем на ошибки. Если во время открытия каталога произошла ошибка, то выводим сообщение об ошибке и заканчиваем работу.
Если открытие каталога произошло успешно, то выводим информацию об удаляемых файлах. Дальше, пока не закончится каталог, в переменную типа dirent считываем информацию об очередном объекте внутри каталога, при помощи системного вызова readdir(). Для полученного файла проверяем что его имя не содержит в начале точки или двух точек. Мы предполагаем, что системных файлов в нашем каталоге нет, а удалять файлы-ссылки с именами «.» и «..» нет надобности. Каждый полученный файл мы удаляем при помощи написанной нами функции delfile(). После того, как прошли и удалили все файлы, закрываем каталог и удаляем его.
Заключение
В процессе выполнения данной курсовой работы мы изучили структуру системы UNIX, и познакомились с ее файловой системой. Кроме того, мы выяснили, что такое системные вызовы, зачем они нужны, а также что такое стандарт Posix. Особое внимание мы уделили системным вызовам стандарта Posix для основных операций с файлами. Таких системных вызовов оказалось немного и с ними легко работать.
Для закрепления полученных знаний было написано простое приложение на языке C, которое демонстрировало работу с основными системными вызовами стандарта Posix. В процессе написания данного приложения пришлось работать с некоторыми системными типами данных, которые описывают различные объекты файловой системы ОС UNIX. Процесс работы с такими типами данных расширил наше понимание работы ядра ОС Unix, и закрепил полученные знания.
Список литературы
Бах М. Дж. Архитектура операционной системы UNIX. : пер. с английского - Prentice-Hall, 1995г. - 387с.
Бовет Д. Чезаре М. Ядро linux, 3-е изд. : пер. с английского - СПб.: БХВ-Петербург, 2007г. – 1104с.
Вахалия Ю. UNIX изнутри. - СПб.: БХВ-Петербург,, 2003г. - 844с.
Джонсон Майкл К., Троан Эрик В. Разработка приложений в среде Linux, 2-е изд. : пер. с английского – М.: ООО «И.Д.Вильямс», 2007г. – 544с.
Иванов Н.Н. Программирование в Linux. Самоучитель. – СПб.: БХВ-Петербург, 2007г. – 416с.
Лав Р. Linux. Системное программирование. : пер. с английского - СПб.: БХВ-Петербург, 2008г. – 416с.
Мэтью Н. Основы программирования в Linux. : пер. с английского - СПб.: БХВ-Петербург, 2009г. – 896с.
Роббинс А. Linux: программирование в примерах. : пер. с английского – М.: КУДИЦ-ОБРАЗ, 2005г. – 656с.
Родригес К.З., Фишер Г., Смолски С. Linux: азбука ядра. : пер. с английского - М.: КУДИЦ-ПРЕСС, 2007г. – 584с.
Стивенс Р., Раго С. UNIX. Профессиональное программирование, 2-е изд. : пер. с английского - СПб.: БХВ-Петербург, 2007г. – 1040с.
Чан Т. Системное программирование на C++ для UNIX. : пер. с английского – К.: БХВ-Киев, 1997г. – 592с.
Приложения
Приложение 1. Код написанного приложения
Написанное приложение демонстрирует работу некоторых системных вызовов Linux по работе с файлами. Для удобства сопровождения и исправления ошибок, приложение разбито на три файла, два заголовочных файла: «file.h» и «folder.h», и одного файла с кодом – main.cpp. В файле - file.h собраны написанные нами функции по работе с файлами, эти функции использую системные вызовы Linux. В файле - folder.h собраны написанные нами функции по работе с каталогами, эти функции использую системные вызовы Linux и написанные нами функции для файлов. В главном файле main.cpp происходит основная работа. Содержимое всех этих файлов представлено ниже.
file.h
#include
#include
#include
#include
#include
#include
#include
#include
#include
/*
* File: file.h
Здесь собраны некоторые нужные нам функции по работе с файлами
Эти функции используют системные вызовы Linux
* Created on 17 Ноябрь 2012 г., 7:53
*/

#ifndef FILE_H
#define FILE_H

#ifdef __cplusplus
extern "C" {
#endif

#ifdef __cplusplus
}
#endif

#endif /* FILE_H */

#include
//Функция переводит номер пользователя системы в его строковый аналог
char * uid_to_name(uid_t uid)
{
//Определяем структуру, которая хранит информацию о пользователе
struct passwd * pw_ptr;
static char numstr[10];
//Пытаемся получить информацию о пользователе с номером uid
if ((pw_ptr = getpwuid(uid)) == NULL)
{
//информации получить не удалось, то возвращаем его номер
sprintf(numstr, "% d", uid);
return numstr;
}
else
{
//если удалось получить пользователя, то возвращаем его имя
return pw_ptr->pw_name;
}

}

#include
//Функция переводит номер группы пользователя системы в его строковый аналог
char * guid_to_name(gid_t gid)
{
//Определяем структуру, где будет записана информация о группе
struct group * grp_ptr;
static char numstr[10];
//Пытаемся получить информацию о группе
if ((grp_ptr = getgrgid(gid)) == NULL)
{
//информации получить не удалось, то возвращаем ее номер
sprintf(numstr, "%d", gid);
return numstr;
}
else
{
//Если удалось получить информацию о группе, то возвращаем ее номер
return grp_ptr->gr_name;
}
}

//функция возвраащет режим доступа к файлу в символьном виде
void mode(int mode, char modestr[])
{
//Обнуляем символьное представление прав доступа
strcpy(modestr, "-----------");
//Определяем тип файла, проверяем его на то является ли он каталогом,
// символьным или блочным устройством.
if (S_ISDIR(mode)) modestr[0] = 'd';
if (S_ISCHR(mode)) modestr[0] = 'c';
if (S_ISBLK(mode)) modestr[0] = 'b';
//Проверяем парва доступа для влядельца этого файла
if (mode & S_IRUSR) modestr[1] = 'r';
if (mode & S_IWUSR) modestr[2] = 'w';
if (mode & S_IXUSR) modestr[3] = 'x';
//Проверяем права доступа для группы владельца
if (mode & S_IRGRP) modestr[4] = 'r';
if (mode & S_IWGRP) modestr[5] = 'w';
if (mode & S_IXGRP) modestr[6] = 'x';
//Провеярем права доступа для остальных
if (mode & S_IROTH) modestr[7] = 'r';
if (mode & S_IWOTH) modestr[8] = 'w';
if (mode & S_IXOTH) modestr[9] = 'x';
}

//Функция выводит на экран информацию о заданном файле
int lsfile(char * fname)
{
//Определяем структуру, где будет записана информацию про файл
struct stat info;
//пытаемся записать информацию о файле в структуру
if (stat(fname, &info) != -1)
{
//Если запись произведена успешно, то формируем строку для вывода
char modestr[11];
//Получаем и переводим в символьный вид инофрмацию о правах доступа на файл,
//После этого выводим ее на экран
mode(info.st_mode, modestr);
printf("mode: %s ", modestr);
//Выводим на экран имя пользователя файла в стркоовом представлении
printf("user: %-8s ", uid_to_name(info.st_uid));
//Выводим на экран имя группы пользователя файла в стркоовом представлении
printf("group: %-8s ", guid_to_name(info.st_gid));
//выводим на экран размер фала
printf("size: %8d ", info.st_size);
//Выводим на экран имя файла
printf("name: %s\n", fname);
return 0;
}
return 1;

}

//Функция создания файла
int createfile(char * filename)
{
//Вызываем системный вызов по созданию файла, результат его работы записываем
int status;
status = creat(filename, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
//Проверяем успешность создания файла
if (status < 0)
{
//Если файл не создан, то выводим сообщение об ошибке и возвращаем -1
fprintf(stderr, "ls: Can't create file %s\n", filename);
return -1;
}
//Есди успешное создание файла, то возвращаем 0
return 0;
}

//Функция удаления файла
int delfile(char * filename)
{
printf("Remove File --- %s\n", filename);
//Используем системный вызов для удаления файла
if (unlink(filename) == -1)
{
//если удаление не произошло. то выводим сообщение об ошибке и возвращаем -1
fprintf(stderr, "Can't Delete file %s!\n", filename);
return 1;
}
//В случае успешного удаления возвращаем 0
return 0;
}


Folder.h
#include "file.h"

/*
* File: folder.h
Здесь собраны некоторые нужные нам функции по работе с каталогами
Эти функции используют системные вызовы Linux
* Created on 17 Ноябрь 2012 г., 7:15
*/


#ifndef FOLDER_H
#define FOLDER_H

#ifdef __cplusplus
extern "C" {
#endif




#ifdef __cplusplus
}
#endif

#endif /* FOLDER_H */

//Функция перехода в заданный каталог
int cd(char * namedir)
{
//Испотзуем системный вызов для смены каталога
if (chdir(namedir))
{
//если смена каталога не произошла, то выводим сообщение об ошибке
fprintf(stderr, "cd: Can't open %s\n", namedir);
}
return 0;
}

//Функция вывода на экран содержимого текущего каталога...
int ls()
{
//Определяем структуру в которой будет записан каталог и элементы его содержимого
DIR * dir_ptr;
struct dirent * direntp;

//Определяем имя текущего каталога
char workdirectory[80];
getcwd(workdirectory, sizeof(workdirectory));

//Открываем и работаем с текущим каталогом
if ((dir_ptr = opendir(workdirectory)) == NULL)
{
//Если открыть каталог не получилось, то выводим сообщение об ошибке...
fprintf(stderr, "ls: Can't open %s\n", workdirectory);
}
else
{
//Если каталог получилось открыть выводим приветственную запись
printf("List --%s Directory!!!\n", workdirectory);
//Пока не пройдем все содержимое каталога, записываем очередной объект каталога
while ((direntp = readdir(dir_ptr)) != NULL)
//Выводим на экран информацию об этом объекте...
lsfile(direntp->d_name);
//Когда прошли весь каталог, то закрываем его
closedir(dir_ptr);
}
}

//Функция создания нвоого каталога
int mk(char * dirname)
{
int status;
//Определяем структуру в которой будет записан каталог
DIR * dir_ptr;

//Провеярем существует ли этот каталог и можно ли его открыть
if ((dir_ptr = opendir(dirname)) == NULL)
{
//Если не усществует, то создаем новый каталог с парвами доступа 770
status = mkdir(dirname, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
return status;
}
else
{
//Если существует, то выводим сообщение и закрываем этот каталог
//Новый каталог создавать не будем
printf("Ditectory Exist!!!\n");
closedir(dir_ptr);
return 1;
}
}

//Функция удаления каталога с заданным именем
int deldir(char * dirname)
{
//Определяем структуру в которой будет записан каталог
DIR * dir_ptr;
struct dirent * direntp;

//Провеярем существует ли этот каталог и можно ли его открыть
if ((dir_ptr = opendir(dirname)) == NULL)
{
//Если открыть нельзя то выводим сообщение об ошибке...
fprintf(stderr, "ls: Can't open %s\n", dirname);
}
else
{
//Если каталог удалось открыть, то выводим список удаляемых файлов
printf("List Delete Files --%s-- Directory!!!\n", dirname);
//Пока не пройдем все объекты каталога
while ((direntp = readdir(dir_ptr)) != NULL)
{
//проверяем чтобы это были файлы, системные файлы мы удалять не будем
if (direntp->d_name[0] != '.')
{
//Если файл не системный, то удаляем его
printf("Need delete file --- %s\n", direntp->d_name);
delfile(direntp->d_name);
}
}
//Закрываем каталог
closedir(dir_ptr);
//Удаляем каталог, данная операция нормально отработает если в каталоге нет файлов кроме "." и ".."
rmdir(dirname);
}

} main.cpp

#include "folder.h"

//основная программа, выполняет все необходимые дейтсвия
int main(int argc, char** argv)
{
printf("Hello. It Is Programm for work file's!\n");
printf("\n\nWorkDir!!!\n");
//Описываем имя переменной, в которой будет записано имя нашего рабочего каталога
char workdirectory[80];
//Получаем имя текущего каталога, имя каталога, где запущена программа
getcwd(workdirectory, sizeof(workdirectory));

//Выводим имя текущего каталога на экран
printf("PWD --- %s\n", workdirectory);
//Дописываем к имени рабочего каталога имя workdirectory
//Именно этот каталог станет нашим рабочим
strcat(workdirectory, "/workfile");

//Создаем рабочий каталог, он создатся в текущем каталоге
mk(workdirectory);
printf("work directory --- %s\n", workdirectory);
cd(workdirectory);
//Производим переход в рабочий каталог и выводим его содержимое на экран
ls();

//В рабочем каталоге создаем новый каталог Test, с которым и будем работать
printf("\n\nFunction MakeDir!!!\n");
char newdirectory[80];
strcpy(newdirectory, workdirectory);
strcat(newdirectory, "/test");
printf("!!!! -------- %s\n", newdirectory);

//Создаем новый каталог и переходим в него
mk(newdirectory);
cd(newdirectory);

//В каталоге Test создаем два тестоввых файла
createfile("test1");
createfile("test2");
//Выводим содержимое каталога Test на экран
ls();

//Проверяем функцию смены прав доступа, меняем права доступа на созданные файлы
printf("\n\nFunction ChMode!!!\n");
chmod("test1", 0750);
chmod("test2", 0777);
//Выводим содержимое каталога Test на экран
ls();

//Проверяем функцию удаления
printf("\n\nFunction Delete!!!\n");
//Удалем каталог Test
deldir(newdirectory);
//Пытаемся вывести на экран его содержимое, для проверки
ls();

//Очищаем за собой место
printf("\n\nWork Directory --- %s\n", workdirectory);
//Переходим в рабочий каталог
cd(workdirectory);
//Проверяем что все удалено и удалеям его
ls();
deldir(workdirectory);

printf("Good Buye!!! It Is Programm for work file's!\n");
return 0;
}

Приложение 2. Результат работы программы
Hello. It Is Programm for work file's!


WorkDir!!!
PWD --- /home/andrey
work directory --- /home/andrey/workfile
List --/home/andrey/workfile Directory!!!
mode: drwxr-xr-x- user: andrey group: andrey size: 4096 name: ..
mode: drwxrwxr-x- user: andrey group: andrey size: 4096 name: .


Function MakeDir!!!
!!!! -------- /home/andrey/workfile/test
List --/home/andrey/workfile/test Directory!!!
mode: drwxrwxr-x- user: andrey group: andrey size: 4096 name: ..
mode: drwxrwxr-x- user: andrey group: andrey size: 4096 name: .
mode: -rwxrwxr-x- user: andrey group: andrey size: 0 name: test2
mode: -rwxrwxr-x- user: andrey group: andrey size: 0 name: test1


Function ChMode!!!
List --/home/andrey/workfile/test Directory!!!
mode: drwxrwxr-x- user: andrey group: andrey size: 4096 name: ..
mode: drwxrwxr-x- user: andrey group: andrey size: 4096 name: .
mode: -rwxrwxrwx- user: andrey group: andrey size: 0 name: test2
mode: -rwxr-x---- user: andrey group: andrey size: 0 name: test1


Function Delete!!!
List Delete Files --/home/andrey/workfile/test-- Directory!!!
Need delete file --- test2
Remove File --- test2
Need delete file --- test1
Remove File --- test1
ls: Can't open


Work Directory --- /home/andrey/workfile
List --/home/andrey/workfile Directory!!!
mode: drwxr-xr-x- user: andrey group: andrey size: 4096 name: ..
mode: drwxrwxr-x- user: andrey group: andrey size: 4096 name: .
List Delete Files --/home/andrey/workfile-- Directory!!!
Good Buye!!! It Is Programm for work file's!











35

Список литературы
1.Бах М. Дж. Архитектура операционной системы UNIX. : пер. с английского - Prentice-Hall, 1995г. - 387с.
2.Бовет Д. Чезаре М. Ядро linux, 3-е изд. : пер. с английского - СПб.: БХВ-Петербург, 2007г. – 1104с.
3.Вахалия Ю. UNIX изнутри. - СПб.: БХВ-Петербург,, 2003г. - 844с.
4.Джонсон Майкл К., Троан Эрик В. Разработка приложений в среде Linux, 2-е изд. : пер. с английского – М.: ООО «И.Д.Вильямс», 2007г. – 544с.
5.Иванов Н.Н. Программирование в Linux. Самоучитель. – СПб.: БХВ-Петербург, 2007г. – 416с.
6.Лав Р. Linux. Системное программирование. : пер. с английского - СПб.: БХВ-Петербург, 2008г. – 416с.
7.Мэтью Н. Основы программирования в Linux. : пер. с английского - СПб.: БХВ-Петербург, 2009г. – 896с.
8.Роббинс А. Linux: программирование в примерах. : пер. с английского – М.: КУДИЦ-ОБРАЗ, 2005г. – 656с.
9.Родригес К.З., Фишер Г., Смолски С. Linux: азбука ядра. : пер. с английского - М.: КУДИЦ-ПРЕСС, 2007г. – 584с.
10.Стивенс Р., Раго С. UNIX. Профессиональное программирование, 2-е изд. : пер. с английского - СПб.: БХВ-Петербург, 2007г. – 1040с.
11.Чан Т. Системное программирование на C++ для UNIX. : пер. с английского – К.: БХВ-Киев, 1997г. – 592с.

Вопрос-ответ:

Какие цели и задачи курсовой работы на тему "ОС UNIX"?

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

Какова история ОС UNIX?

ОС UNIX была разработана в 1969 году в лаборатории Bell Labs. Первоначально ОС UNIX создавалась как небольшая операционная система для использования на коммуникационных компьютерах, но со временем она стала широко распространяться и использоваться на различных платформах. UNIX оказал значительное влияние на развитие операционных систем, и многие из его концепций и принципов были заимствованы другими операционными системами.

Какова структура ОС UNIX?

ОС UNIX имеет иерархическую структуру, основанную на файловой системе. Верхний уровень иерархии представлен корневым каталогом, который содержит подкаталоги и файлы. Каталоги могут содержать другие подкаталоги и файлы, таким образом создавая древовидную структуру. Каждый файл в ОС UNIX имеет уникальное имя в пределах своего каталога.

Какие системные вызовы используются для работы с файлами и каталогами в ОС UNIX?

В ОС UNIX для работы с файлами и каталогами используются различные системные вызовы, такие как open(), close(), read(), write(), mkdir(), rmdir() и другие. Системные вызовы позволяют открывать файлы, считывать и записывать данные в файлы, создавать и удалять каталоги, перемещаться по файловой системе и выполнять другие операции над файлами и каталогами.

Как выбрать систему и среду программирования для работы с ОС UNIX?

При выборе системы и среды программирования для работы с ОС UNIX можно руководствоваться различными факторами, такими как операционная система, на которой планируется выполнять разработку, язык программирования, с которым вы планируете работать, и доступные инструменты и библиотеки для работы с ОС UNIX. Важно выбрать систему и среду программирования, которые поддерживают необходимые функциональные возможности и обеспечивают удобный и эффективный процесс разработки.

Какие цели и задачи рассматриваются в курсовой работе о ОС UNIX?

Курсовая работа посвящена изучению основных аспектов операционной системы UNIX. Основной целью работы является приобретение студентом навыков работы с ОС UNIX, а также изучение ее структуры, файловой системы и системных вызовов. В ходе выполнения курсовой работы студенту предлагается выбрать систему и среду программирования, реализовать необходимые операции и оформить результаты в виде программы.

Какова история развития ОС UNIX?

ОС UNIX была создана в 1969 году Кеном Томпсоном и Деннисом Ритчи в лаборатории компьютерных наук Bell Labs. Впоследствии UNIX стал одной из самых популярных и востребованных операционных систем для серверов и рабочих станций. Сегодня ОС UNIX имеет множество различных вариаций, таких как macOS, Linux, FreeBSD и др., которые широко используются в различных сферах.

Какова структура ОС UNIX?

ОС UNIX имеет модульную структуру, состоящую из ядра операционной системы и набора утилит и программ. Ядро ОС UNIX отвечает за выполнение основных функций, таких как управление процессами, управление памятью, ввод-вывод данных и управление файловой системой. Утилиты и программы предоставляют пользователю интерфейс для взаимодействия с ОС UNIX и выполнения различных задач.

Что представляет собой файловая система в ОС UNIX?

Файловая система в ОС UNIX представляет собой организацию иерархической структуры каталогов и файлов, которая позволяет размещать и хранить информацию на диске. В ОС UNIX используется файловая система иерархического типа, где все объекты внутри каталога, включая сам каталог, являются файлами.

Какие системные вызовы используются в ОС UNIX для работы с файлами и каталогами?

В ОС UNIX для работы с файлами и каталогами используются различные системные вызовы, такие как open, close, read, write, mkdir, rmdir и др. С помощью этих системных вызовов можно открыть файл, закрыть файл, читать данные из файла, записывать данные в файл, создавать и удалять каталоги и др. Каждый системный вызов имеет свои параметры и возможности, позволяющие оперировать файлами и каталогами в ОС UNIX.

Какие цели и задачи рассматриваются в курсовой работе по ОС UNIX?

Цели и задачи курсовой работы по ОС UNIX включают изучение истории ОС UNIX, структуры ОС UNIX, файловой системы ОС UNIX, системных вызовов для работы с файлами и каталогами. В практической части работы необходимо выбрать систему и среду программирования, выбрать необходимые операции, реализовать приложение. Также требуется составить список литературы и приложить код написанного приложения и результат его работы.

Какова история развития ОС UNIX?

История ОС UNIX начинается в 1960-х годах в лаборатории компании Bell Labs. Она была разработана для использования на мейнфреймах. В 1970-х годах ОС UNIX стала доступна для других компаний и университетов, что способствовало ее распространению и развитию. В 1980-х годах были созданы различные коммерческие версии ОС UNIX, а в 1990-х годах была выпущена первая открытая версия ОС UNIX под названием Linux.