Обычно при работе с файлами ввод и вывод осуществляетсяпоследовательно: при каждом обращении к функциям
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.