66516
ВЗАИМОДЕЙСТВИЕ С ФАЙЛОВЫМИ СИСТЕМАМИ UNIX/WINDOWS
Лабораторная работа
Информатика, кибернетика и программирование
Цель работы — изучение основных файловых операций в ОС UNIX и Windows, работы механизмов перенаправления ввода/вывода, конвейера, механизма управления устройствами ввода-вывода UNIX при помощи специальных файлов устройств, а также с организацией прямого доступа к диску в ОС Windows.
Русский
2014-08-22
89.96 KB
0 чел.
Министерство образования и науки Российской Федерации
Санкт-Петербургский государственный политехнический университет
Факультет технической кибернетики
Кафедра «Информационная безопасность компьютерных систем»
ОТЧЕТ
по лабораторной работе №3
«ВЗАИМОДЕЙСТВИЕ С ФАЙЛОВЫМИ СИСТЕМАМИ UNIX/WINDOWS»
по курсу «Операционные системы»
Выполнил
студент гр. 2088/4 А.А.Чернышев
<подпись>
Руководитель А.С. Коноплев
<подпись>
Санкт-Петербург
2011
Цель работы изучение основных файловых операций в ОС UNIX и Windows, работы механизмов перенаправления ввода/вывода, конвейера, механизма управления устройствами ввода-вывода UNIX при помощи специальных файлов устройств, а также с организацией прямого доступа к диску в ОС Windows.
CHS (от англ. Cylinder, Head, Sector) система адресации сектора (как минимальной единицы в операции чтения(записи)) дисковых накопителей (жёстких магнитных дисков, накопителей на гибких магнитных дисках и т. п.) основанная на использовании физических адресов геометрии диска.
Сектор на жёстком диске адресуется кортежем из трёх чисел: цилиндр-головка-сектор, именно так, как этот блок физически расположен на диске.
Под цилиндром (Cylinder) понимается совокупность дорожек одинакового радиуса на всех магнитных дисках (блинах) одного жёсткого диска. Контроллер жёсткого диска интерпретирует значение в радиус, на который передвигается магнитная головка чтения (Head). С каждой магнитной поверхности магнитного диска чтение производит только одна головка, следовательно, указывая головку, мы также указываем ту поверхность, с которой следует считывать информацию. Сектор диска, как понятно из геометричекого определения, интерпретируется как диапазон градуса поворота диска
Очевидно, что такая схема плохо подходит к недисковым устройствам хранения (ленты, сетевые хранилища), потому и не используется для них. Схема CHS и её расширенная версия ECHS использовались на ранних приводах ATA использующих интерфейс ESDI.
В жёстких дисках объёмом более 524 Мб со встроенными контроллерами эти координаты уже не соответствуют физическому положению сектора на диске и являются «логическими координатами», что обусловило введение новых режимов адресования, сперва Large и в современных LBA.
LBA (англ. Logical block addressing) механизм адресации и доступа к блоку данных на жёстком диске, при котором системному контроллеру нет необходимости учитывать геометрию самого жесткого диска (количество цилиндров, сторон, секторов на цилиндре). Контроллеры современных IDE-дисков в качестве основного режима трансляции адреса используют LBA.
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;
}
Для чего служит стандартная библиотека потоков ввода/вывода (stdio)?
Библиотека stdio является надстройкой над системными вызовами. Она предоставляет высокоуровневый интерфейс работы с потоками ввода-вывода для программ на языке C, независимо от используемой операционной системы и ее системных вызовов. Для фактического доступа к файлам из кода библиотеки производятся обращения к системным функциям ОС.
Что подразумевается под понятием «конвейер программ»?
Под конвейером понимается такой способ обработки информации несколькими программами, при котором выходные данные одной программы служат входными для следующей. В среде UNIX принято соглашение, по которому программа, редназначенная для использования в конвейере, должна получать входные данные из стандартного потока ввода (stdin или файл 0) и заносить результаты их обработки в стандартный поток вывода (stdout или файл 1).
Каким образом можно создавать фрагментированные файлы, содержащие пустые области?
Совместное использование функций lseek() и write() позволяет создавать фрагментированные файлы, содержащие пустые области, в которые никогда не осуществлялась запись данных.
В данной работе была исследованы взаимодействия с файловыми системами WINDOWS и UNIX.
А также другие работы, которые могут Вас заинтересовать | |||
52678. | Прийоми формування мотивації до навчання | 76.5 KB | |
Математичний мовленнєвий крос Учитель зачитує незавершені ви слови та пропонує учням доповнити їх необхідними відомостями Цікава мозаїка Група учнів отри мує картки на яких запропоно вано набір слів з яких потрібно скласти задані по няття Сніжна грудка Як росте сніжна грудка так і цей методичний прийом залучає до активної роботи все більшу кількість учнів. Так ні Учитель учень загадує поняття пов'язане з те мою що вивча ється а учні на магаються знайти відповідь став лячи навідні питання відповідати на які слід... | |||