66516

ВЗАИМОДЕЙСТВИЕ С ФАЙЛОВЫМИ СИСТЕМАМИ UNIX/WINDOWS

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

Информатика, кибернетика и программирование

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

Русский

2014-08-22

89.96 KB

0 чел.

Министерство образования и науки Российской Федерации

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

Факультет технической кибернетики

Кафедра «Информационная безопасность компьютерных систем»

ОТЧЕТ

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

«ВЗАИМОДЕЙСТВИЕ С ФАЙЛОВЫМИ СИСТЕМАМИ UNIX/WINDOWS»

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

Выполнил

студент гр. 2088/4    А.А.Чернышев

                           <подпись>

Руководитель     А.С. Коноплев

                           <подпись>

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

2011

  1.  Формулировка задания

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

2. Использованные теоретические сведения

CHS (от англ. Cylinder, Head, Sector) — система адресации сектора (как минимальной единицы в операции чтения(записи)) дисковых накопителей (жёстких магнитных дисковнакопителей на гибких магнитных дисках и т. п.) основанная на использовании физических адресов геометрии диска.

Сектор на жёстком диске адресуется кортежем из трёх чисел: цилиндр-головка-сектор, именно так, как этот блок физически расположен на диске.

Под цилиндром (Cylinder) понимается совокупность дорожек одинакового радиуса на всех магнитных дисках (блинах) одного жёсткого диска. Контроллер жёсткого диска интерпретирует значение в радиус, на который передвигается магнитная головка чтения (Head). С каждой магнитной поверхности магнитного диска чтение производит только одна головка, следовательно, указывая головку, мы также указываем ту поверхность, с которой следует считывать информацию. Сектор диска, как понятно из геометричекого определения, интерпретируется как диапазон градуса поворота диска

Очевидно, что такая схема плохо подходит к недисковым устройствам хранения (ленты, сетевые хранилища), потому и не используется для них. Схема CHS и её расширенная версия ECHS использовались на ранних приводах ATA использующих интерфейс ESDI.

В жёстких дисках объёмом более 524 Мб со встроенными контроллерами эти координаты уже не соответствуют физическому положению сектора на диске и являются «логическими координатами», что обусловило введение новых режимов адресования, сперва Large и в современных — LBA.

LBA (англ. Logical block addressing) — механизм адресации и доступа к блоку данных на жёстком диске, при котором системному контроллеру нет необходимости учитывать геометрию самого жесткого диска (количество цилиндров, сторон, секторов на цилиндре). Контроллеры современных IDE-дисков в качестве основного режима трансляции адреса используют LBA.

3. Результаты работы

3.1. Выполнение индивидуального задания

1) Выполнить запуск программ, приведенных в примерах 1-4. Модифицируйте программу из примера 1 на использование функции perror() для извещения оператора об ошибках. Модифицируйте программу из примера 4 для выполнения побайтового копирования одного файла в другой.

Пример 1. Открытие файла с обработкой ошибок.

#include <stdio.h>

#include <fcntl.h>

#include <errno.h>

int main(){

 int fd;

 if((fd = open("nonesuch", O_RDONLY)) == -1)

 perror("Ошибка при работе с файлом!");

}

Пример 2. Чтение и запись в файл.

#include<unistd.h>

#include<fcntl.h>

main()

{

  int fd;

 ssize_t nread;

 char buf[1024];

 fd = open (“data”, O_RDONLY);

  lseek(fd, 10, 0);

 nread = read(fd, buf, 1024);

 close(fd);

}

Пример 3. Цикл просмотра открытых дескрипторов

#include <stdio.h>

#include <unistd.h>

#include <fcntl.h>

int main (void)

{

 int fd, x;

 for(fd = 0; fd < 1000; fd++)

{

 x = fcntl(fd, F_GETFL, 0);

 if(x != -1)

  fprintf(stdout, "%d:%d\n", fd, fcntl(fd, F_GETFL));

 }

 return 0;

}

Пример 4. Создание потоков ввода-вывода.

#include<stdio.h>

#include<errno.h>

#include<fcntl.h>

int main(){

 

 char buffer[1024]= "";

FILE *inf, *outf;

 if ((inf = fopen("in.txt" ,"r")) == NULL)

 perror("невозможно открыть входной файл");

 if ((outf = fopen("out.txt", "w")) == NULL)

 perror("невозможно открыть выходной файл");

 

 fread(buffer ,1 , 1024, inf);

fwrite(buffer, 1, sizeof(buffer), outf);

fclose(inf);

fclose(outf);

 return 0;

}

2) Написать на языке С программу readwrite10 выполняющую чтение 10 байт из стандартного потока ввода и запись их в стандартный поток вывода.

#include "stdafx.h"

#include <stdio.h>

int main()

{

  char str[11];

  fgets(str,11,stdin);

  char *buf;

  buf=str;

  while((*buf != '\0') && fputc(*(buf++), stdout) != EOF);

  while(getchar()!='q');

  return 0;

}

3) Произвести чтение нулевого сектора жесткого диска и вывести в доступном виде (с пояснениями), интерпретацию 0-го дескриптора основного раздела. Операционная система WindowsNT/2000/XP.

#include "stdafx.h"

#include <windows.h>

#include <stdio.h>

#include<iostream>

#pragma pack(push, 1)

typedef struct PART

{

UCHAR ucActivePartFlag; // Индикатор активного раздела

UCHAR ucDH; // CHS-адрес первого сектора, head

UCHAR ucCL; // sector

UCHAR ucCH; // cylinder

 UCHAR ucType; // Тип раздела (файловой системы)

UCHAR ucEndDH; // CHS-адрес последнего сектора, head

 UCHAR ucEndCL; // sector

UCHAR ucEndCH; // cylinder

 DWORD dwLba; // LBA-адрес первого сектора

DWORD dwSize; // Количество секторов в разделе

};

typedef struct MBR

{

 BYTE        LoadCode[0x1BE];

 struct PART rt[4];

 WORD        EndFlag; };

 int PartitionCodes[] = {

 0x00, 0x01,0x02,0x03,0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,0x63,0x64,0x65,0x75,0x80, 0x81,0x82,0x83, 0x93, 0x94,0xa5, 0xb7, 0xb8, 0xc7,0xdb, 0xe1, 0xe3, 0xf2, 0xff, 0x0b, 0x0c, 0x0e, 0x0f

};

 char* PartitionNames[] = {

 "NULL", "DOS 12-bit FAT","XENIX root","XENIX usr", "DOS 16-bit FAT", "Extended partition", "DOS 16-bit >=32M","OS/2 HPFS or NTFS","AIX", "AIX bootable","OS/2 Boot Manager","GNU HURD", "Novell Netware 286", "Novell Netware 386","PC/IX", "Old MINIX","Linux/MINIX", "Linux swap", "Linux native", "Amoeba", "Amoeba BBT","FFS (BSD/386)","BSDI fs", "BSDI swap","Syrinx", "CP/M","DOS access","DOS R/O", "DOS secondary", "BBT (bad track table)","Первичный раздел Windows FAT-32","Расширенный раздел Windows FAT-32","Расширенный раздел Windows FAT-16", "Первичный раздел Windows FAT-32"

};

 

 char* GetPartitionName(int code){

 int i;

 for(i = 0; i < sizeof(PartitionCodes)/sizeof(int); i++)

{

 if(PartitionCodes[i] == code)

 {

  return PartitionNames[i];

 }

}

 return "Not defined";

}

int main(void)

{

setlocale (LC_ALL,"rus");

 HANDLE hDrive = CreateFile(TEXT("\\\\.\\PHYSICALDRIVE0"),               

                             GENERIC_READ|GENERIC_WRITE,         

                             FILE_SHARE_READ|FILE_SHARE_WRITE,

                             NULL,

                             OPEN_EXISTING,

                             FILE_ATTRIBUTE_NORMAL,

                             NULL);

 if (INVALID_HANDLE_VALUE == hDrive)

   printf("CreateFile failed %d\n", GetLastError());

 else

 {

   struct MBR mbr;

   DWORD      NumberOfBytesRead = 0;

   RtlZeroMemory(&mbr, sizeof(mbr));

   if (0 == ReadFile(hDrive, &mbr, sizeof(mbr), &NumberOfBytesRead, 0))

     printf("ReadFile failed %d\n", GetLastError());

   else if (sizeof(mbr) != NumberOfBytesRead)

     printf( "sizeof(mbr) = %d, ReadFile read %d\n",

       sizeof(mbr), NumberOfBytesRead);

   else

   {

     int i=0;

  char* Name=GetPartitionName(mbr.rt[i].ucType);

  printf("Метка активного раздела: %s\n", mbr.rt[i].ucActivePartFlag ? "Активен" : "Неактивен");

printf("CHS-адрес первого сектора, head: %d\n", mbr.rt[i].ucDH);

 printf("CHS-адрес первого сектора, sector: %d\n", mbr.rt[i].ucCL);

 printf("CHS-адрес первого сектора, cylinder: %d\n", mbr.rt[i].ucCH);

 printf("Тип раздела (файловой системы): %s\n", Name);

printf("CHS-адрес последнего сектора, head: %d\n", mbr.rt[i].ucEndDH);

 printf("CHS-адрес последнего сектора, sector: %d\n", mbr.rt[i].ucEndCL);

 printf("CHS-адрес последнего сектора, cylinder: %d\n", mbr.rt[i].ucEndCH);

 printf("LBA-адрес первого сектора: %d\n", mbr.rt[i].dwLba);

 printf("Количество секторов в разделе: %d\n", mbr.rt[i].dwSize);

}

   CloseHandle(hDrive);

 }

getchar();

 return 0;

};

В результате получили:

 Итак, общая структура MBR может быть представлена следующей таблицей:

Смещение Длина Описание

000h      446  Код загрузчика

1BEh       64  Таблица разделов

          16  Раздел 1

1CEh       16  Раздел 2

1DEh       16  Раздел 3

1EEh       16  Раздел 4

1FEh        2  Сигнатура (55h AAh)

Каждый 16-ти байтовый блок имеет следующую структуру:

Смещение Длина Описание

00h        1   Признак активности раздела

01h        1   Начало раздела - головка

02h        1   Начало раздела - сектор (биты 0-5), дорожка (биты 6,7)

03h        1   Начало раздела - дорожка (старшие биты 8,9 хранятся в байте номера сектора)

04h        1   Код типа раздела

05h        1   Конец раздела - головка

06h        1   Конец раздела - сектор (биты 0-5), дорожка (биты 6,7)

07h        1   Конец раздела - дорожка (старшие биты 8,9 хранятся в байте номера сектора)

08h        4   Смещение первого сектора

0Ch        4   Количество секторов раздела

4) Напишите свою версию команды chmod, используя ее описание в справочном руководстве вашей системы UNIX.

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <errno.h>

/* проверка корректности режимов */

int checkmode(char *s)

{

char *p, buf[1024];

strncpy(buf, s, sizeof(buf));

for(p = buf; *p != '\0'; p++) {

 *p -= '0';

 if(*p < 0 || *p > 7 || (p-buf) > 4)

  return -1;

}

return 0;

}

int

main(int argc, char *argv[])

{

mode_t mode;

 

if(argc < 3) {

 printf("usage: %s <mode> <file...>\n", argv[0]);

 return 1;

}

if(checkmode(argv[1]) < 0) {

 printf("chmod: invalid mode \"%s\"\n", argv[1]);

 return 1;

}

sscanf(argv[1], "%o", &mode); /* приводим режим в восьмеричное число*/

 for(argv += 2; *argv != NULL; argv++) {

 if(chmod(*argv, mode) < 0)

  printf("chmod: %s: %s\n", *argv, strerror(errno));

 }

return 0;

}

3.2. Ответы на контрольные вопросы

Для чего служит стандартная библиотека потоков ввода/вывода (stdio)?

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

Что подразумевается под понятием «конвейер программ»?

Под  конвейером  понимается  такой  способ  обработки  информации несколькими  программами,  при  котором  выходные  данные  одной  программы служат входными для следующей. В среде UNIX принято соглашение, по которому программа,  редназначенная  для  использования  в  конвейере,  должна  получать входные  данные  из  стандартного  потока  ввода  (stdin  или  файл  0)  и  заносить  результаты  их  обработки  в  стандартный  поток  вывода  (stdout  или  файл  1).

Каким образом можно создавать фрагментированные файлы, содержащие пустые области?

Совместное  использование  функций  lseek()  и  write() позволяет  создавать  фрагментированные  файлы,  содержащие  пустые  области,  в которые никогда не осуществлялась запись данных.  

4. Выводы

В данной работе была исследованы взаимодействия с файловыми системами WINDOWS и UNIX.


 

А также другие работы, которые могут Вас заинтересовать

18736. Организация социологических исследований проблем молодежи 23.71 KB
  Организация социологических исследований проблем молодежи. Стратегия эмпирического исследования молодежных проблем. Специфика использования инструментария эмпирического исследования при обращении к молодежной проблематике. Проблемы молодежи способы их выявления...
18737. Технологический подход в системе воспитания молодёжи 30.31 KB
  Технологический подход в системе воспитания молодёжи. Основы понятий технология воспитательная технология. Классификация воспитательных технологий. Сравнительный анализ воспитательных технологий педагогов Макаренко А.С. Иванова И.П. Сухомлинского В.А. Классифика...
18738. Предмет и сущность профилактики как технологии работы с молодежью 21.55 KB
  Предмет и сущность профилактики как технологии работы с молодежью. Определения цели задачи профилактики ее место в системе социальных отношений. Профилактика это действия направленные на: 1. Предотвращение возможных физических психических социокультурных колл
18739. Теоретический аспект девиантного поведения молодежи 22.74 KB
  Теоретический аспект девиантного поведения молодежи. Сущность понятия девиация соотношение понятий нормадевиация основные формы девиантного поведения. Социальные нормы и социальный контроль. Гендерный аспект девиантного поведения. Сущность понятия девиаци
18740. Специфика социально-политического поведения молодежи и ее причины 23.05 KB
  Специфика социальнополитического поведения молодежи и ее причины. Молодёжь социальнодемографическая группа выделяемая на основе совокупности возрастных характеристик особенностей социального положения и обусловленных тем и другим социальнопсихологических сво...
18741. Формирование здорового образа жизни современной молодежи 26.35 KB
  Формирование здорового образа жизни современной молодежи. Понятие здоровье и здоровый образ жизни. Здоровый образ жизни совокупность духовных ценностей и реальных видов форм и благоприятных для здоровья эффектов деятельности по обеспечению оптимального удов
18742. Специфика деятельности специалиста по работе с молодежью в условиях детского оздоровительного лагеря 27.16 KB
  Специфика деятельности специалиста по работе с молодежью в условиях детского оздоровительного лагеря. Условия и порядок принятия на работу педагогических работников. Функции вожатого и воспитателя. Права обязанности и ответственность вожатого ребенка. Логика смены. ...
18743. Особенности работы с временным детским и молодежным коллективами 30.93 KB
  Особенности работы с временным детским и молодежным коллективами. Понятие временного коллектива. Особенности развития временного коллектива. Учет социальнопсихологических и гендерных особенностей детей и молодежи. Формы отрядных дел. Корпоративная культура малой гр...
18744. Организация и координация развития добровольческого (волонтерского) движения 25.71 KB
  Организация и координация развития добровольческого волонтерского движения. Нормативноправовая база регулирующая деятельность волонтерского движения. Волонтёрская деятельность это широкий круг деятельности включая традиционные формы взаимопомощи и самопом...