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.


 

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

10191. Развитие средств транспорта в XX – начале XXI вв. Состояние и перспективы железнодорожного дела в современной России 36.5 KB
  Развитие средств транспорта в XX начале XXI вв. Состояние и перспективы железнодорожного дела в современной России Двигатель внутреннего сгорания помог человеку твердо обосноваться в воздушном пространстве. Использование в этих целях паровой машины оказалось неудачн...
10192. Основные этапы освоения космоса. Жизненный путь и научная деятельность К.Э. Циолковского 34 KB
  Основные этапы освоения космоса. Жизненный путь и научная деятельность К.Э. Циолковского Крупные успехи современной тяжелой авиации всецело связаны с использованием реактивного двигателя. Он основан на принципе движения ракеты т.е. противодействии силе термической р
10193. Создание и совершенствование ЭВМ. Роль электроники и компьютерных технологий в современном мире 47.5 KB
  Создание и совершенствование ЭВМ. Роль электроники и компьютерных технологий в современном мире Логическим результатом эволюции радиоэлектронных технологий стало создание ЭВМ. Назвать точную дату изобретения и автора первой электронной вычислительной машины достат
10194. Формирование и развитие системы наука - техника во второй половине ХХ - начале ХХI вв. Задачи гуманитаризации технических наук на современном этапе 30 KB
  Формирование и развитие системы наука техника во второй половине ХХ начале ХХI вв. Задачи гуманитаризации технических наук на современном этапе На современном этапе задачи гуманитаризации науки все более и более актуально встают перед всем человечеством. Это связ...
10195. Образ и его представление, место и метод. Психический аспект образа 60.5 KB
  Образ и его представление место и метод Метод в отношении природы Психический аспект образа. Образ и его представление место и метод По утверждению русского философа В.Ф. Эрна в книге Верховное постижение Платона образ пещеры выдуман сами
10196. Философия как мировоззрение 41 KB
  Философия как мировоззрение: Учение теоретическое т.е. наиболее общее представление о мире и о природе человека и перспективах его познания выраженное в категориях. Насущные вопросы с точки зрения науки Критическое отношение к наукам к обучению стремление больш
10197. От досократиков к Аристотелю: основные проблемы и теоретическая необходимость 755 KB
  От досократиков к Аристотелю: основные проблемы и теоретическая необходимость Ранее были представлены вводные замечания и мы можем двигаться производя примерный хронологический обзор различных предыдущих эпох мысли или практик повлиявших на развитие психологиче...
10198. Краткий обзор представление о нравственности в религии 64 KB
  Краткий обзор представление о нравственности в религии План. 1. Введение. Современность о религии и этике 2. Отношение религии к философии и науке. Премудрость и ее два вида Отношение к ее видам в различные времена 3. Краткий исторический обзор религии в отношении ...
10199. Сократ, Платон и Аристотель 705.5 KB
  Сократ Платон и Аристотель Соответствующий контраст между позицией софистов и тем что Сократ вытолкнувший классический период греческой мысли предложил явный объективный идеализм и позицию косвенного реализма впрочем и аналогичные воззрения Платона и Аристотеля...