русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Низкоуровневый ввод/вывод - операторы READ и WRITE


Дата добавления: 2015-01-16; просмотров: 1209; Нарушение авторских прав


Самый низкий уровень ввода/вывода в системе UNIX не пре-дусматривает ни какой-либо буферизации, ни какого-либо дру-гого сервиса; он по существу является непосредственным вхо-дом в операционную систему. Весь ввод и вывод осуществляетсядвумя функциями: READ и WRITE. Первым аргументом обеих функ-ций является дескриптор файла. Вторым аргументом являетсябуфер в вашей программе, откуда или куда должны поступатьданные. Третий аргумент - это число подлежащих пересылкебайтов. Обращения к этим функциям имеют вид: N_READ=READ(FD,BUF,N);N_WRITTEN=WRITE(FD,BUF,N); При каждом обращении возвращается счетчик байтов, указываю-щий фактическое число переданных байтов. При чтении возвра-щенное число байтов может оказаться меньше, чем запрошенноечисло. Возвращенное нулевое число байтов означает конец фай-ла, а "-1" указывает на наличие какой-либо ошибки. При запи-си возвращенное значение равно числу фактически записанныхбайтов; несовпадение этого числа с числом байтов, котороепредполагалось записать, обычно свидетельствует об ошибке. Количество байтов, подлежащих чтению или записи, можетбыть совершенно произвольным. Двумя самыми распространеннымивеличинами являются "1", которая означает передачу одногосимвола за обращение (т.е. Без использования буфера), и"512", которая соответствует физическому размеру блока намногих периферийных устройствах. Этот последний размер будетнаиболее эффективным, но даже ввод или вывод по одному сим-волу за обращение не будет необыкновенно дорогим. Объединив все эти факты, мы написали простую программудля копирования ввода на вывод, эквивалентную программе ко-пировки файлов, написанной в главе 1. На системе UNIX этапрограмма будет копировать что угодно куда угодно, потомучто ввод и вывод могут быть перенаправлены на любой файл илиустройство. #DEFINE BUFSIZE 512 /*BEST SIZE FOR PDP-11 UNIX*/ MAIN() /*COPY INPUT TO OUTPUT*/ \( CHAR BUF[BUFSIZE]; INT N; WHILE((N=READ(0,BUF,BUFSIZE))>0) WRITE(1,BUF,N); \) Если размер файла не будет кратен BUFSIZE, то при некоторомобращении к READ будет возвращено меньшее число байтов, ко-торые затем записываются с помощью WRITE; при следующем пос-ле этого обращении к READ будет возвращен нуль. Поучительно разобраться, как можно использовать функцииREAD и WRITE для построения процедур более высокого уровня,таких как GETCHAR, PUTCHAR и т.д. Вот, например, вариантфункции GETCHAR, осуществляющий ввод без использования буфе-ра. #DEFINE CMASK 0377 /*FOR MAKING CHAR'S > 0*/ GETCHAR() /*UNBUFFERED SINGLE CHARACTER INPUT*/ \( CHAR C; RETURN((READ(0,&C,1)>0 7 & CMASK : EOF); \) Переменная "C" должна быть описана как CHAR, потому что фун-кция READ принимает указатель на символы. Возвращаемый сим-вол должен быть маскирован числом 0377 для гарантии его по-ложительности; в противном случае знаковый разряд может сде-лать его значение отрицательным. (Константа 0377 подходитдля эвм PDP-11, но не обязательно для других машин). Второй вариант функции GETCHAR осуществляет ввод больши-ми порциями, а выдает символы по одному за обращение. #DEFINE CMASK 0377 /*FOR MAKING CHAR'S>0*/ #DEFINE BUFSIZE 512 GETCHAR() /*BUFFERED VERSION*/ \( STATIC CHAR BUF[BUFSIZE]; STATIC CHAR *BUFP = BUF; STATIC INT N = 0; IF (N==0) \( /*BUFFER IS EMPTY*/ N=READ(0,BUF,BUFSIZE); BUFP = BUF; \) RETURN((--N>=0) ? *BUFP++ & CMASK : EOF); \)


<== предыдущая лекция | следующая лекция ==>
Дескрипторы файлов | Открытие, создание, закрытие и расцепление (UNLINK)


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.155 сек.