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.


 

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

76876. Спинной мозг 186.68 KB
  Пластинки возникают из нервного лентовидного гребня расположенного вдоль спинного мозга сзади. Утолщение стенок изменение общей формы развивающегося мозга сопровождается сужением центрального канала. У детей 35 лет и новорожденных сильнее выражены шейногрудное и поясничнокрестцовое утолщения спинного мозга.
76877. Развитие головного мозга 184.2 KB
  Стабилизация или элиминация межнейронных связей наступает в конце созревания мозга. Вначале 5ой недели разделяется задний пузырь для образования заднего и продолговатого мозга. Изза неравномерности роста развивающегося мозга появляются в пузырях сагиттальные изгибы ориентированные выпуклостью в дорсальную сторону первые два и вентральную третий: теменной изгиб самый ранний возникает в области среднемозгового пузыря отделяя средний мозг от промежуточного и конечного; затылочный изгиб в заднем пузыре отделяет спинной мозг от...
76878. Серое и белое вещество головного мозга 182.07 KB
  Базальные ядра хвостатое чечевицеобразное миндалевидное по происхождению и развитию подразделяются: на новые ядра неостриатум в составе хвостатого ядра и скорлупы чечевицеобразного; на старые ядра палеостриатум в составе бледных шаров: медиального и латерального; на древние архистриатум миндалевидное ядро и гиппокамп. Базальные ядра относят к подкорковым структурам. Среди базальных ядер выделяют стриапаллидарную систему включающую головку хвостатого ядра скорлупу и бледные шары. Хвостатое ядро nucleus cudtus имеет:...
76879. Верхнелатеральная поверхность полушарий 184.05 KB
  В функциональном отношении борозды и извилины с сосредоточенными в них полями и нейронами составляют ядра чувствительных или двигательных анализаторов. Они начинаются на лобном полюсе располагаются параллельно друг другу и заканчиваются у предцентральной извилины. Между ними находятся хорошо выраженные извилины: Верхняя лобная извилина часть которой лежит и на медиальной поверхности полушария. В середине нижней лобной извилины поле 45 располагается ядро анализатора пения при поражении которого возникают вокальная амузия и аграмматизм...
76880. Борозды и извилины медиальной и базальной поверхностей полушарий большого мозга 183.45 KB
  Каждое полушарие снаружи имеет: три поверхности: верхнелатеральную выпуклую и самую большую медиальную плоскую нижнюю или базальную по общей конфигурации повторяющую рельеф черепных ям; поверхности отделяются друг от друга краями: верхним нижнелатеральным и нижнемедиальным; наиболее выступающие части полушария называются полюсами: лобным височным и затылочным; рельеф поверхности включает борозды и извилины размеры и направление которых отличаются большой индивидуальной изменчивостью; серое вещество борозд извилин составляет...
76881. Строение коры большого мозга 186.85 KB
  В корковом конце анализатора он различал ядро и рассеянные элементы. Кора постцентральной извилины поля 123 и верхней теменной дольки поля 57 содержат ядро анализатора общей и проприоцептивной чувствительности чувствительный гомункулус со следующими особенностями расположения: проекция в перевернутом виде: ноги вверху голова внизу; диспропорциональная проекция с неравномерным представительством по площади: для головы и ее органов кисти и большого пальца много места для остальных отделов мало что отражает важность трудовых...
76882. Комиссуральные и проекционные волокна полушарий головного мозга (мозолистое тело, свод, спайки, внутренняя капсула) 183.45 KB
  Комиссуральные волокна являясь длинными отростками корковых нейронов соединяют между собой правое и левое полушария большого мозга образуя мозолистое тело свод спайки: ростральную переднюю сводчатую. В мозолистом теле они формируют лучистость в которой находятся волокна соединяющие новые высшие корковые центры. Части мозолистого тела: клюв начало внизу прилежит к терминальной пластинке; колено переход к среднему отделу; ствол средний отдел; валик задний округленный отдел; В полушариях комиссуральные волокна образуют:...
76883. Боковые желудочки мозга 181.62 KB
  Стенки центральной части бокового желудочка: верхняя стенка поперечные волокна мозолистого тела; нижняя дно тело хвостатого ядра часть задней поверхности таламуса и терминальная полоска; медиальная стенка тело свода; с латеральной стороны мозолистое тело и хвостатое ядро соединяются под острым углом как бы исключающим латеральную стенку. Стенки переднего рога: медиальная прозрачная перегородка; латеральная и нижняя головка хвостатого ядра; передняя верхняя и часть нижней стенки волокна мозолистого тела. Стенки нижнего...
76884. Обонятельный мозг, его центральный и периферический отделы 182.63 KB
  По современным представлениям в процессе эволюции позвоночных обоняние на основе обонятельного мозга выступило в качестве организатора целостных функций связанных с формированием всех безусловно рефлекторных реакций инстинктов: ориентировочных оборонительных пищевых сексуальных и др. Благодаря обонятельному мозгу сформировалось новое морфофункциональное объединение лимбическая система или висцеральный мозг обеспечивающие человеку следующие свойства: эмоциональномотивационное поведение; сложное поведение связанное со сменой фаз...