Произвольный доступ - lseek

Обычно при работе с файлами ввод и вывод осуществляетсяпоследовательно: при каждом обращении к функциям read и write чтение или запись начинаются с позиции, непосредст-венно следующей за предыдущей обработанной. Но при -69- необходимости файл может читаться или записываться в любомпроизвольном порядке. Обращение к системе с помощью функции lseek позволяет передвигаться по файлу, не производя факти-ческого чтения или записи. В результате обращения lseek (fd, offset, origin); текущая позиция в файле с дескриптором fd передвигается напозицию offset (смещение), которая отсчитывается от места,указываемого аргументом origin (начало отсчета). Последующеечтение или запись будут теперь начинаться с этой позиции.Аргумент offset имеет тип long; fd и origin имеют тип int. Аргумент origin может принимать значения 0, 1 или 2, указы-вая на то, что величина offset должна отсчитываться соот-ветственно от начала файла, от текущей позиции или от концафайла. Например, чтобы дополнить файл, следует перед записьюнайти его конец: lseek (fd,0 l,2); чтобы вернуться к началу, можно написать: lseek (fd, 0l,0); Обратите внимание на аргумент 0 l; его можно было бы записатьи в виде (long) 0. Функция lseek позволяет обращаться с файлами примернотак же, как с большими массивами, только ценой более медлен-ного доступа. Пример. Функция, считывающая любое количество байтов, начи-ная с произвольного места в файле. /*читать n байтов с позиции pos в buf */ get (fd, pos, buf, n) int fd, n; long pos; char *buf; { lseek (fd, pos,0); /*get to pos */ return (read (fd, buf, n)); }

Управление процессами

В операционной системе ДЕМОС часто требуется вызвать изпрограммы и выполнить в виде отдельного процесса другуюпрограмму. Следующий раздел описывает простейший способсделать это, а далее будут рассмотрены базовые средствауправления процессами, имеющиеся в ОС ДЕМОС. -70-

Функция system

Простейший способ вызвать другую программу - использо-вать стандартную функцию system: system (" командная строка ") Функция имеет один параметр - строку, которую она анализи-рует и выполняет точно так же, как выполняются команды, вво-димые интерпретатором shell с терминала. Функция выполняеткоманду и возвращает целое число - код ответа выполненнойкоманды (0, если все кончилось нормально). В команднойстроке воспринимаются любые символы управлениявводом/выводом >, <, и т.п. Следует учесть, что, если в программе вывод буферизу-ется, то перед вызовом функции system необходимо вытолкнутьбуфера, например вызвав функцию fflush.

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



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