Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб по С и С++ / lc++teor.doc
Скачиваний:
70
Добавлен:
17.03.2015
Размер:
147.46 Кб
Скачать

Void main(void)

{

char far *vid_mem=(char far *)0xB8000000; //адрес начала видеопамяти

int x, y;

char attr=0x71; //атрибут для вывода символа

for(x=0; x<80; x++) //заполнение экрана фоном

for(y=0; y<25; y++)

{

*(vid_mem+y*160+x*2)=176; //код символа

*(vid_mem+y*160+x*2+1)=attr; //значение атрибута

}

}

/* ЛАБОРАТОРНАЯ РАБОТА 6 (DIR_FILE)

УПРАВЛЕНИЕ НАКОПИТЕЛЯМИ, КАТАЛОГАМИ, ФАЙЛАМИ

Управление накопителями

Прототипы функций описаны в заголовочном файле dir.h.

int getdisk(void); - функция возвращает номер текущего диска (0 - A, 1 - B, 2 - C и т.д.).

int setdisk(int drive); - функция устанавливает текущим диск в соответствии с drive (0 - A, 1 - B, 2 - C и т.д.).

Управление каталогами

Прототипы всех функций описаны в заголовочном файле dir.h.

В некоторых функциях используются строки, максимальная длина которых указана в макроопределениях с учетом '\0':

MAXPATH (значение - 80) - путь

MAXDRIVE (значение - 3) - диск, включая двоеточие

MAXDIR (значение - 66) - каталог, включая '\'

MAXFILE (значение - 9) - файл

MAXEXT (значение - 5) - расширение, включая '.'

int chdir(const char *path); - функция изменяет текущий каталог в соответствии с path. Поиск ведется на текущем диске. Имя каталога задается относительно текущего или корневого каталога. Возврат при ошибке: 1.

int mkdir(const char *path); - функция создает один каталог с именем, определенным path. Возврат при ошибке: -1.

int rmdir(const char *path); - функция удаляет один каталог с именем, определенным path. Каталог должен быть пустым, не текущим, не корневым. Возврат при ошибке: 1.

int getcurdir(int drive, char *directory); - функция читает имя текущего каталога на устройстве drive (0 - по умолчанию, 1 - A, 2 - B, 3 - C и т.д.). Результат - в directory. Имя каталога не включает имя корневого каталога. Возврат при ошибке: -1.

char *getcwd(char *buf, int buflen); - функция читает полное имя текущего каталога (включая диск) в buf размером не более buflen. Результат - указатель на строку вида: C:\FFF\YYY. Возврат при ошибке: NULL.

int findfirst(const char *path, struct ffblk *ffblk, int attrib);

Функция ищет первый файл или каталог с данным именем и аттрибутом. Имя с указанием пути и диска ( возможно использование ? и * в имени). Атрибут (attrib) может иметь значения (необходимо пдключить dos.h):

0 - файл для чтения и записи

FA_RDONLY - файл для чтения

FA_HIDDEN - скрытый файл

FA_SYSTEM - системный файл

FA_LABEL - метка тома

FA_DIREC - каталог

FA_ARCH - архив.

Для найденного файла или каталога заполняется структура ffblk, cодержащая*/

char ff_reserved[21];

char ff_attrib; /* атрибут */

unsigned ff_ftime; /* время */

unsigned ff_fdate; /* дата */

long ff_fsize; /* размер */

char ff_name[13]; /* имя */

/*Возврат при ошибке: -1.

int findnext(struct ffblk *ffblk); - функция возвращает следующий файл или каталог с заданным именем и атрибутом (см.выше).

char *searchpath(const char *file); - поиск файла по имени сначала в текущем каталоге, а затем по установленным путям поиска. Результат - адрес строки с полным именем файла, начиная с имени диска.

/*Возврат при ошибке: NULL.

void fnmerge(char *path,const char *drive,const char *dir, const char *name, const char *ext);

Функция создает полное имя файла (path) из отдельных компонент: имя диска, каталога (путь), файла, расширения.

int fnsplit(const char *path, char *drive, char *dir, char *name, char *ext);

Функция разбивает полное имя (path) на составляющие компоненты (обратная fnmerge), каждая компонента обязательна, но может быть нулевой строкой.

Управление файлами

Временный файл

Прототипы функций описаны в заголовочном файле stdio.h.

char *tmpnam(char *s); - функция генерирует имя временного файла и помещает его в строку с указателем s. Возврат при ошибке: NULL.

FILE * tmpfile (void); - создает и открывает временный файл в режиме "w+", возвращает указатель потока. После выполнения программы временные файлы удаляются. Возврат при ошибке: NULL.

int rmtmp(void) - функция удаляет временные файлы, созданные с помощью tmpfile, в текущем каталоге. Возвращает число удаленных файлов.

Генерация имени

char *mktemp(char *template); - прототип в dir.h.

Функция создает уникальное имя с помощью модификации заданного имени template вида baseXXXXXX, где base - задается пользователем, XXXXXX - формируется функцией.Результат - адрес строки с именем. Возврат при ошибке: NULL.

Доступ к файлу

Прототипы функций в заголовочном файле io.h.

int access(const char *path, int amode); - функция проверяет существование файла и режимы доступа к нему (amode): 00 - существование, 04 - чтение, 02 - запись, 06 - чтение/ запись). Возврат: 0 - доступ разрешен, 1 - доступ не разрешен.

int chmod(const char *path, int amode); - изменить права доступа (amode):

S_IWRITE - запись, S_IREAD - чтение, S_IWRITE | S_IREAD -запись и чтение.

Необходимо подключить sys\stat.h. Возврат при ошибке: 1.

Размер файла

Прототипы функций в io.h.

long filelength (int handle); - функция возвращает длину в байтах файла с дескриптором handle. Возврат при ошибке: -1.

int chsize(int handle, long size); - функция расширяет (дозапись '\0') или сужает (обрезает с конца) файл с дескриптором handle до длины size. Возврат при ошибке: -1.

Действия над файлом

Прототипы функций описаны в stdio.h.

int remove(const char *c); - функция удаляет файл с заданным именем.

Возврат при ошибке: -1.

int unlink(const char *path); - функция удаляет файл с заданным именем, прототип и в io.h. Возврат при ошибке: -1.

int rename(const char *oldname, const char *newname);

Функция переименовывает файл или каталог или перемещает файл. Имя включает путь, но диск текущий. Возврат при ошибке: не нуль.

Пример 1.

/* С помощью функции getcurdir формируется имя текущего ката лога включая и имя диска и имя корневого каталога */

#include <dir.h>

#include <stdio.h>

#include <string.h>

char *current_directory(char *path)

{

strcpy(path, "X:\\"); /* в строку path записывается X:\ */

path[0] = 'A' + getdisk(); /* замена X на текущее имя диска */

getcurdir(0, path+3); /* с четвертой позиции строки path записывается текущий каталог на текущем диске */

return(path);

}

int main(void)

{

char curdir[MAXPATH];

current_directory(curdir);

printf("Текущий каталог %s\n", curdir);

return 0;

}

/* Пример 2.

/* С помощью fnsplit поразбить имя на составляющие части. */

#include <stdio.h>

#include <dir.h>

int main(void)

{

char *s="\autoexec.bat";

char drive[MAXDRIVE];

char dir[MAXDIR];

char file[MAXFILE];

char ext[MAXEXT];

int flags;

/* flags указывает заданы ли все компоненты в строке s */

flags=fnsplit(s,drive,dir,file,ext);

printf("Command processor info:\n");

if(flags & DRIVE) /* сформировано ли имя диска */

printf("\tdrive: %s\n",drive);

if(flags & DIRECTORY) /* сформировано ли имя каталога */

printf("\tdirectory: %s\n",dir);

if(flags & FILENAME) /* сформировано ли имя файла */

printf("\tfile: %s\n",file);

if(flags & EXTENSION) /* сформировано ли расширение */

printf("\textension: %s\n",ext);

return 0;

}

/* ЛАБОРАТОРНАЯ РАБОТА 7 (PROCESS)

УПРАВЛЕНИЕ ПРОЦЕССАМИ

Термин "процесс" относится к программе, которая выполняется под управлением операционной системы.

Используя функции управления процессом можно запустить, остановить и управлять процессом из программы.

Прототипы функций описаны в заголовочном файле process.h.

Запуск нового процесса

Функции exec... и spawn... используют для вызова одного процесса (дочернего) из другого (родительского). В функциях exec... дочерний процесс перекрывает родительский, поэтому возврат управления в родительский процесс невозможен. В функциях spawn... первый параметр mode определяет, что происходит с родительским процессом:

P_WAIT (значение 0) - приостановить на время работы дочернего,

P_OVERLAY (значение 2) - перекрыть родительский процесс дочерним (аналогично exec...). При нормальном завершении функции spawn... возвращают 0, при ошибке все функции возвращают -1.

int execl(char *path, char *arg0, ...,char *argN, NULL);

int spawnl(int mode, char *path, char *arg0, ...,char *argN, NULL);

int execle(char *path, char *arg0, ...,char *argN, NULL,char **env);

int spawnle(int mode, char *path, char *arg0, char *argN, NULL, char **env);

int execlp(char *path, char *arg0, ...,char *argN, NULL);

int spawnlp(int mode, char *path, char *arg0, ... char *argN, NULL);

int execlpe(char *path, char *arg0, ...,char *argN, NULL, char **env);

int spawnlpe(int mode, char *path, char *arg0, ..., char *argN, NULL, char **env);

int execv(char *path, char *argv[]);

int spawnv(int mode, char *path, char *argv[]);

int execve(char *path, char *argv[], char **env);

int spawnve(int mode, char *path, char *argv[], char **env);

int execvp(char *path, char *argv[]);

int spawnvp(int mode, char *path, char *argv[]);

int execvpe(char *path, char *argv[], char **env);

int spawnvpe(int mode, char *path, char *argv[], char **env);

При составлении имени функции к основе (exec и spawn) добавляются суффиксы: v,l,p,e, которые имеют следующие значения: v - вызываемому процессу список аргументов передается в виде массива указателей на строки символов (argv[0]-обязат.). Режим используется, когда число и значения аргументов определяются во время работы. l - вызываемому процессу список аргументов передается в виде отдельных строк (arg0 - обязателен). Режим используется, когда число аргументов постоянное и аргументы известны заранее. p - используется переменная окружения PATH для поиска файла. e - вызываемому процессу передается массив ссылок на переменные окружения env. Path - имя файла, или имя файла с указанием пути от корневого каталога, или имя файла с указанием пути от текущего каталога.

Если имя файла без расширения и не заканчивается точкой ищется файл .exe, .com, иначе - ищется файл без расширения.

Выполнение команды системы

int system(char *command); - дополнит.описана в stdlib.h.

Строка рассматривается как директива командному процессору. Возврат при ошибке: -1, иначе: 0.

Завершение процесса

void exit(int status); - дополнит. описана в stdlib.h.

Завершается процесс после скидывания буферов потоков.

status - код возврата (0 - норм.завершение).

Примеры

Нижеприведенная программа находится в файле c:\user\arg_main.c

и используется для запуска дочернего процесса из родительского.

/* Программа распечатывает на экране аргументы функции main и

окружение среды.

*/

#include <stdio.h>

int main( int argc, char *argv[], char **envp )

{

int i;

printf("аргументы:\n");

for (i=0; i < argc; ++i)

printf("[%2d] %s\n", i, argv[i]);

printf("окружение среды:\n");

for (i=0; envp[i]!=NULL; ++i)

printf("[%2d] %s\n", i, envp[i]);

return 0;

}

Файлы последующих программ находятся в каталоге c:\user\i41, он же является текущим.

Пример 1.

/* Функция execve. Аргументы дочернему процессу передаются через массив указателей на строки, среда окружения роди тельского процесса передается без изменения.

*/

#include <process.h>

#include <stdio.h>

#include <errno.h>

void main(int argc, char *argv[], char **envp)

{

int i;

printf("Аргументы командной строки:\n");

for (i=0; i<argc; i++)

printf("[%2d] : %s\n", i, argv[i]);

printf("функция arg_main...\n");

execve("\\user\\arg_main.exe", argv,envp);

/* оказываемся здесь только в случае ошибки при запуске

дочернего процесса */

perror("exec error");

exit(1);

}

Пример 2.

/* Функция execlpe. Аргументы дочернему процессу передаются как набор строк (последняя обязательно NULL), среда окру жения передается измененная (переменная PATH). Поиск файла arg_main.exe производится с использованием путей, определенных в PATH. */

#include <process.h>

#include <stdio.h>

#include <conio.h>

int main(int argc, char *argv[ ], char *envp[ ] )

{

int result,i= -1;

/* поиск строки окружения, начинающейся на PATH */

while(strncmp(envp[++i],"PATH",4)) ;

/* переменной PATH устанавливается новое значение */

strcpy(envp[i],"PATH=c:\\user");

clrscr();

puts("программа arg_main");

result = execlpe("arg_main.exe", "arg_main.exe", "арг1",NULL, envp);

perror("Error from execlpe");

exit(1);

return 0;

}

Пример 3.

/* Функция spawnvp. Путь до файла arg_main.exe указан относительно текущего каталога. Родительский процесс ожидает окончания дочернего, после чего выполняется функция system.

*/

#include <process.h>

#include <stdio.h>

#include <conio.h>

int main(int argc, char *argv[])

{

int result;

char str[80]="dir";

clrscr();

puts("программа arg_main");

result = spawnvp(P_WAIT, "..\\arg_main.exe", argv);

if (result == -1) /* ошибка при запуске */

{

perror("Error from spawnvp");

exit(1);

}

puts("выполняется команда системы dir");

system(str);

return 0;

}

/* ЛАБОРАТОРНАЯ РАБОТА 5 (PORT)

ФУНКЦИИ ВВОДА И ВЫВОДА ЧЕРЕЗ ПОРТЫ

Для связи с различными микросхемами ЭВМ микропроцессор использует прямые и косвенные обращения к памяти, порты ввода/вывода и сигналы прерывания.

Порты ввода/вывода - это двери, через которые информация поступает на устройства ввода/вывода или передается с них. Каждый порт идентифицируется 16-разрядным номером порта, который может меняться от 0 до 65535. Каждому устройству назначается свой определенный порт или порты. Процессор, задавая номер порта, посылает данные или управляющую информацию в конкретный порт, а порт отвечает, посылая назад процессору данные или информацию о состоянии. Запись в определенные порты может нарушить работу ЭВМ, однако, и чтение из порта может привести к неприятным последствиям. Программировать работу портов следует очень осторожно.

Функции ввода/вывода через порт

unsigned char inportb(int port); - прототип в dos.h.

Функция читает байт из порта ввода port - беззнаковое от 0 до 65535.

Void outportb(int port, unsigned char byte);

Функция записывает байт byte в порт вывода port.

Int bioscom(int cmd,char abyte,int port);- прототип в bios.h.

Функция предназначена для работы с последовательным каналом связи (адаптером RS232).

Int biosprint(int cmd, int abyte, int port);

Функция предназначена для работы с принтером, указанным параметром port.

Генерация звука

В качестве иллюстрации работы портов ввода/вывода рассмотрим работу порта 97, который управляет громкоговорителем через один из регистров контроллера 8255. Регистр может принять 8-разрядное число, которое помещается в двоичном коде. Каждый разряд числа рассматривается как переключатель ("включено" - "выключено") для соответствующего устройства или воздействия. Для того, чтобы включить громкоговоритель необходимо в нулевой и в первый разряд (отсчет справа налево) поместить 1, не изменяя при этом остальных разрядов. Это достигается с помощью поразрядной операции ИЛИ (|) или передачей в регистр числа 79. Прежде чем передать это число в регистр, необходимо запомнить прежнее его состояние, а после подачи звукового сигнала восстановить содержимое регистра. Следующая программа заставляет громкоговоритель подать сигнал определенной длительности.

Пример.

# include <stdio.h>

# include <dos.h>

Соседние файлы в папке Лаб по С и С++