Вход

ОС UNIX

Рекомендуемая категория для самостоятельной подготовки:
Курсовая работа*
Код 171860
Дата создания 2013
Страниц 43
Источников 11
Мы сможем обработать ваш заказ (!) 22 ноября в 12:00 [мск]
Файлы будут доступны для скачивания только после обработки заказа.
2 660руб.
КУПИТЬ

Содержание

Содержание
Введение
Цели и задачи курсовой работы
Теоретическая часть
История ОС 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 <fcntl.h>
#include <fstream>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdlib.h>
/*
* 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 <pwd.h>
//Функция переводит номер пользователя системы в его строковый аналог
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 <grp.h>
//Функция переводит номер группы пользователя системы в его строковый аналог
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

Список литературы [ всего 11]

Список литературы
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с.
Очень похожие работы
Найти ещё больше
Пожалуйста, внимательно изучайте содержание и фрагменты работы. Деньги за приобретённые готовые работы по причине несоответствия данной работы вашим требованиям или её уникальности не возвращаются.
* Категория работы носит оценочный характер в соответствии с качественными и количественными параметрами предоставляемого материала. Данный материал ни целиком, ни любая из его частей не является готовым научным трудом, выпускной квалификационной работой, научным докладом или иной работой, предусмотренной государственной системой научной аттестации или необходимой для прохождения промежуточной или итоговой аттестации. Данный материал представляет собой субъективный результат обработки, структурирования и форматирования собранной его автором информации и предназначен, прежде всего, для использования в качестве источника для самостоятельной подготовки работы указанной тематики.
bmt: 0.00472
© Рефератбанк, 2002 - 2024