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.


 

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

84881. Before You Finish TD. Tracking Philosophy 50 KB
  Your goal might be to work on multiple articles for one session. It might be to work crosstracks in another. Often, your goal might just be to create an easy workout for the dog for motivation after a tough previous workout. A goal might be to lay off a week or two.
84882. Teaching turns or Overshooting corners 36.5 KB
  I lay my dogs a normal track but about 6-10 feet before I make a corner I shorten my step to make at clear to the dog something has changed. the corner I lay very well after after the corner I place a tidbit, most of my dogs when they came to a strong change like this they slowed checked it out more...
84884. Tracking Dog Training Into the Wind 33 KB
  Bring the dog into the sent pad with the wind to it’s back until he figures out that the damaged ground contains the food. After a couple weeks start bringing the dog to the sent pad at different angles according to the wind.
84885. Tracking to fast 31.5 KB
  I was on the road to correcting this problem working with YYY. Like I mentioned, suggestions such as more food, incredibly tasty food, pinch, double lines, butt strap, more intricate corners, tiny articles, etc., etc. came from some very accomplished trainers.
84886. Article Indication by Dennis Helms 296 KB
  The proper way for a dog to indicate an article when found is for the dog to lie down in a straight line with the track. The article should be between the dog’s front feet and he should touch it with his chin.
84887. Article Indication 31.5 KB
  First you will need some articles. Start with articles around 3 inches square, pieces of leather, wood, and carpet samples work very well. Use different materials and train on different surfaces including grass and dirt.
84888. CAN YOU TRACK YOUR OWN TRACKS 27 KB
  Knowing where your track is going and being able to find the articles is important. So important that it is time for you to go to the tracking field, without your dog, and lay a typical track. Age it for whatever time you usually age your tracks.
84889. Force Tracking training using articles 84 KB
  Dogs learn that articles are safe spots, rest spots, reward spots. Initially you will lay a straight line track with 20-30 articles. There will be an article at the scent pad. When the dog downs at ANY article you will reward (leaving the article) pet keeping the dog calm, then pick up the article...