
- •1. Клиент-серверная организация системного программного обеспечения.
- •2. Система электронной документации.
- •5. Процессы в состоянии zombie.
- •6. Атрибуты процесса. Ключевые слова команды ps.
- •Id,state,time,sl,re,pagein,vsz,rss,lim,tsiz,%cpu,%mem, command.
- •7. Сигналы.
- •9. Встроенные команды управления атрибутом cdir
- •10. Встроенная команда изменение атрибута umask
- •11. Управление заданиями.
9. Встроенные команды управления атрибутом cdir
Рассмотрим несколько команд, которые реализованы не внешними утилитами (исполняемыми файлами в директориях по маршрутам, заданным в переменной PATH), а являются встроенными командами оболочки, такая команда называется builtin. В их числе все команды, изменяющие атрибуты процесса, которые наследуется дочерним процессом при системном вызове fork(). Оболочка изменяет эти атрибуты для себя и будет передавать эти измененные значения всем порождаемым дочерним процессам при каждом запуске программы (исполняемого файла). Если такую команду реализовать как внешнюю утилиту (исполняемый файл), тогда новый процесс, образованный при запуске утилиты, будет независимым от shell дочерним процессом, он для себя поменяет маску или текущий директорий, но завершаясь вернет управление оболочке, у которой эти атрибуты оставались и останутся неизменными. Все последующие процессы сеанса будут наследовать старые значения атрибута. Таким образом эти команды принципиально не могут быть реализованы внешними утилитами. Также очевидно, что в виде builtin реализованы команды изменения параметров и настроек и выдачи справочной информации по самой оболочки.
Следующие 4 builtin-команды (cd, pushd, popd dirs) управляют атрибутом процесса сdir, это указатель в u-area процесса на структуру vnode рабочего или текущего (current) директория процесса.
cd [dir] - аргумент задает имя нового текущего директория, это имя транслируется, полученный в результате трансляции адрес структуры vnode присваивается указателю сdir. Если аргумент опущен, то текущим становится значение по умолчанию – HOMEDIR владельца процесса оболочки, оно содержится в переменной HOME, таким образом посылка команды без аргументов эквивалентна команде:
cd $HOME
Оболочка ведет стек директориев, который можно просматривать командой dirs. Новое значение текущего директория, присвоенное командной cd, замещает собой значение в вершине стека, число элементов в стеке, называемое длиной стека, при этом не изменяется (вершина стека находится слева в списке, выводимом командой dirs).
pushd [-n] [dir] – без опции -n команда работает точно также, как и команда cd с тем единственным отличием, что новое значение текущего директория добавляется в вершину стека, продвигая вправо уже имеющиеся в стеке элементы, длина стека при этом увеличивается на 1. Если задана опция –n (от «no change»), то текущий директорий не изменяется, его имя остается в вершине стека (крайнее левое значение в выводе команды dirs), а сразу после него вставляется аргумент dir и длина стека увеличивается на 1. Cтек может быть замкнут в кольцо и проведена ротация его элементов влево +n или вправо -n, где символ “n” шрифтом курсив обозначает число; если оно со знаком “+” это номер элемента, считая с 0, от вершины стека (левого конца), а со знаком “–” это номер элемента, считая с 0, от правого конца стека. Ротация производится до тех пор, пока отсчитанный, считая с 0, элемент попадет в вершину стека и соответствующий директорий становится текущим. Для такой ротации служит следующая форма команды pushd:
pushd [-n] [+n] [-n] – обычно в этой форме опция «no change» не задается. Длина стека не изменятся. Если все-таки задать еще и опцию -n , то текущий директорий не будет изменяться, останутся только манипуляции со стеком, но в этом случае значение элемента, попавшего в результате ротации на вершину стека, будет заменено на имя текущего директория.
Пример. Пусть длина стека 6 элементов и текущий директорий d0:
d0 d1 d2 d3 d4 d5 . Посылаем команду:
pushd -2 Результат:
d3 d4 d5 d0 d1 d2 Текущим становится директорий d3. Посылаем:
pushd +1 Результат:
d4 d5 d0 d1 d2 d3 Текущим становится директорий d4.
popd [-n] [+n] [-n] – удалить элементы из стека директориев и изменить текущий директорий. Чаще всего эту команду применяют без опций для восстановления текущего директория после одного или более шагов его изменения командой pushd. Для этого требуется столько же шагов команды popd без опций. Однако можно это сделать и за один шаг, указав место в стеке того директория, который нужно сделать текущим и при этом удалить его из стека. Символ “n” шрифтом курсив обозначает число со знаком “+” это номер элемента, считая с 0, от вершины стека (левого конца), а со знаком “–” это номер элемента, считая с 0, от правого конца стека. Этот элемент из стека удаляется а соответствующий ему директорий делается текущим. Длина стека уменьшается на 1. Если задать еще и опцию –n , то текущий директорий не будет изменяться, будет выполнено только удаление элемента из стека.
dirs [+n] [-n] [-cplv] без опций команда выдает список директориев, запомненных в стеке на данный момент. По умолчанию список выдается в одну строку и в качестве разделителя между именами директориев используется пробел. Добавляются директории в стек командой pushd, а удаляются элементы стека командой popd. Можно выдавать только одно имя директория, используя опции [+n] [-n] , это число, которое задает место элемента в стеке и должно быть выдано; со знаком + отсчитывается, начиная с 0, от левого конца списка, со знаком – отсчитывается, начиная с 0, от правого конца списка. Остальные опции:
-c - очиcтить стек, т.е. удалить все элементы из стека;
-l - выдавать полностью имя директориев, не используя тильду для сокращенного обозначения homedir владельца процесса.
-p – выводить каждый элемент списка с новой строки;
-v - выводить каждый элемент списка с новой строки, а в начале строки проставлять индекс элемента в стеке.
pwd [-L | -P] - вывести в STDOUT маршрутное имя текущего директория процесса оболочки. Опции:
-L – в выдаваемом маршрутном имени могут быть символьные связи (symlink). Такой вывод предусмотрен и по умолчанию.
-P – выводить физический абсолютный маршрут текущего директория.
Поскольку эта команда только выдает информацию, но не изменяет экспортируемых переменных и наследуемых атрибутов процесса, она может быть реализована и в виде внешней команды как исполняемый файл утилиты. Утилита pwd есть и в системе FreeBSD, начиная с релиза FreeBSD 2.1. Первоначально она была написана на Perl (автор Wolfram Schneider), в текущей версии FreeBSD 8.2 использована переписанная на С (Daniel Papasian) При использовании утилиты единственным отличием от builtin является то, что по умолчанию предусмотрен вывод согласно опции -P . Поскольку в оболочке bash имеется builtin pwd, то именно он вызывается при посылке команды pwd. При посылке команды без маршрута оболочка всегда сначала проверяет нет ли builtin с именем команды и только если такой builtin отсутствует, тогда задействуется механизм fork-exec для запуска утилиты.