Низкоуровневый ввод/вывод

Самый низкий уровень ввода/вывода в системе ДЕМОС непредусматривает ни какой-либо буферизации, ни какого-либодругого сервиса; он по существу является непосредственнымобращением к операционной системе. Весь ввод и вывод осу-ществляется двумя функциями: read и write. Первым аргумен-том обеих функций является дескриптор файла. Вторым аргумен-том является буфер в вашей программе, откуда или куда должныпоступать данные. Третий аргумент - это число подлежащихпересылке байтов. Обращения к этим функциям имеют вид: n _ read = read (fd, buf, n); n _ written = write (fd, buf, n); -67- При каждом обращении возвращается счетчик байтов, указываю-щий фактическое число переданных байтов. При чтении возвра-щенное число байтов может оказаться меньше, чем запрошенноечисло. Возвращенное нулевое число байтов означает конецфайла, а "-1" указывает на наличие какой-либо ошибки. Призаписи возвращенное значение равно числу фактически записан-ных байтов; несовпадение этого числа с числом байтов, кото-рое предполагалось записать, обычно свидетельствует обошибке. Количество байтов, подлежащих чтению или записи, можетбыть совершенно произвольным. Двумя самыми распространеннымивеличинами являются "1", что означает передачу одного сим-вола за обращение (т.е. без использования буфера), и "512",что соответствует физическому размеру блока на многих пери-ферийных устройствах. Этот последний размер будет наиболееэффективным, но даже ввод или вывод по одному символу заобращение не будет слишком дорогим. Пример. Копирование ввода на вывод. В системе ДЕМОС эта программа будет копировать что угодно куда угодно,потому что ввод и вывод могут быть перенаправлены на любойфайл или устройство. #define BUFSIZE 512 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 будет возвращен нуль.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: