учебники, программирование, основы, введение в,

 

Введение в курс практических занятий. Знакомство с операционной системой UNIX

Введение в курс практических занятий
Настоящий курс практических занятий является одной из первых известных авторам попыток систематически проиллюстрировать лекционный курс «Основы операционных систем» на примере конкретной операционной системы, а именно – операционной системы UNIX.
Необходимость связывания систематического изложения материала семинарских и практических занятий с материалом лекций возникла в процессе становления базового четырехсеместрового набора курсов по информатике в МФТИ. Новизна излагаемого материала для многих преподавателей заставила лекторов для соблюдения некоторого стандарта обучения готовить по каждой теме методические указания для участников семинаров, и эти указания, как показал опыт, могут с успехом использоваться и студентами, в том числе для самостоятельного обучения. Обкатанная версия этих методических указаний, расширенная, дополненная и модифицированная по результатам многочисленных обсуждений предлагается сейчас вашему вниманию.
Семестровый курс «Основы операционных систем» является третьим по счету курсом цикла «Информатика», которому предшествуют курсы «Алгоритмы и алгоритмические языки» и «Архитектура ЭВМ и язык ассемблера». Предполагается, что к началу практических занятий студенты умеют программировать на языке С (с использованием функций стандартной библиотеки для работы с файлами и строками) и имеют представление о внутреннем устройстве ЭВМ.
Переход от обучения студентов информатике с использованием мэйнфреймов к обучению с использованием сетевых классов персональных компьютеров, свершившийся за последние двадцать лет, неизбежно наложил свой отпечаток на форму проведения практических занятий. Вместо раздельного проведения семинаров и практикума (лабораторных работ) появилось нечто смешанное – семинарский практикум или практический семинар, когда изложение нового материала в течение одного занятия чередуется с короткими практическими программными работами. Именно в виде таких семинаров-практикумов и построен наш курс. Ввиду достаточно высокой сложности используемых программных конструкций мы решили приводить готовые примеры программ для иллюстрации рассматриваемых понятий с последующей их модификацией студентами. Это позволило увеличить насыщенность занятий и за семестровый курс охватить большее количество материала.
Для иллюстрации лекций была выбрана операционная система UNIX, как наиболее открытая, изящная и простая для понимания, хотя создание подобного практического курса возможно и для других операционных систем, например для Windows NT.
В целом практический курс включает в себя 16 занятий, одно из которых в середине семестра – между семинарами 9 и 10-11 – посвящено проведению контрольной работы по материалам лекций. Некоторым темам выделено по два занятия, и соответствующие семинары имеют сдвоенные номера. Естественно, разбиение тем на занятия является достаточно условным, желательно лишь, чтобы они непосредственно следовали за лекциями, на которых основываются.
Далее мы переходим к изложению материала семинарско-практического курса.
По своему содержанию материал текущих семинаров 1–2 является наиболее критичным по отношению к используемому виду операционной системы и политике администрирования. Поэтому многие вопросы будут содержать ссылку «узнайте у своего системного администратора». Прежде чем приступать к занятиям, необходимо обеспечить наличие пользовательских account'ов для обучающихся. «Узнайте у своего системного администратора», как это сделать.
В тексте семинаров программные конструкции, включая имена системных вызовов, стандартных функций и команды оболочки операционной системы, выделены другим шрифтом. В UNIX системные вызовы и команды оболочки инициируют сложные последовательности действий, затрагивая различные аспекты функционирования операционной системы. Как правило, в рамках одного семинара полное объяснение всех нюансов их поведения является невозможным. Поэтому подробные описания большинства используемых системных вызовов, системных функций и некоторых команд оболочки операционной системы при первой встрече с ними вынесены из основного текста на серый фон и обведены рамочкой, а в основном тексте рассматриваются только те детали их описания, для понимания которых хватает накопленных знаний.
Если какой-либо параметр у команды оболочки является необязательным, он будет указываться в квадратных скобках, например, [who]. В случае, когда возможен выбор только одного из нескольких возможных вариантов параметров, варианты будут перечисляться в фигурных скобках и разделяться вертикальной чертой, например, {+ | - | =}.
Краткая история операционной системы UNIX, ее структура
На первой лекции мы разобрали содержание понятия «операционная система», обсудили функции операционных систем и способы их построения. Все материалы первой и последующих лекций мы будем иллюстрировать практическими примерами, связанными с использованием одной из разновидностей операционной системы UNIX – операционной системы Linux, хотя постараемся не связывать свой рассказ именно с ее особенностями.
Ядро операционной системы Linux представляет собой монолитную систему. При компиляции ядра Linux можно разрешить динамическую загрузку и выгрузку очень многих компонентов ядра – так называемых модулей. В момент загрузки модуля его код загружается для исполнения в привилегированном режиме и связывается с остальной частью ядра. Внутри модуля могут использоваться любые экспортируемые ядром функции.
Свой нынешний вид эта операционная система обрела в результате длительной эволюции UNIX-образных операционных систем. История развития UNIX подробно освещена практически во всей литературе, посвященной вычислительной технике. Как правило, это во многом один и тот же текст, с небольшими изменениями кочующий из одного издания в другое, и нам не хотелось бы повторяться. Мы просто сошлемся на достаточно подробное изложение в книге или на оригинальную работу одного из родоначальников UNIX . Для нас наиболее важным во всей этой истории является существование двух стержневых линий эволюции – линии System V и линии BSD, поскольку в процессе обучения мы будем сталкиваться с различиями в их реализации.

Системные вызовы и библиотека libc
Основной постоянно функционирующей частью операционной системы UNIX является ее ядро. Другие программы (системные или пользовательские) могут общаться с ядром посредством системных вызовов, которые по сути дела являются прямыми точками входа программ в ядро. При исполнении системного вызова программа пользователя временно переходит в привилегированный режим, получая доступ к данным или устройствам, которые недоступны при работе в режиме пользователя.
Реальные машинные команды, необходмые для активизации системных вызовов, естественно, отличаются от машины к машине, наряду со способом передачи параметров и результатов между вызывающей программой и ядром. Однако с точки зрения программиста на языке C использование системных вызовов ничем внешне не отличается от использования других функций стандартной ANSI библиотеки языка C, таких как функции работы со строками strlen(), strcpy() и т.д. Стандартная библиотека UNIX – libc – обеспечивает C-интерфейс к каждому системному вызову. Это приводит к тому, что системный вызов выглядит как функция на языке C для программиста. Более того, многие из уже известных вам стандартных функций, например функции для работы с файлами: fopen(), fread(), fwrite() при реализации в операционной системе UNIX будут применять различные системные вызовы. По ходу курса нам придется познакомиться с большим количеством разнообразных системных вызовов и их C-интерфейсами.
Большинство системных вызовов, возвращающих целое значение, использует значение -1 для оповещения о возникновении ошибки и значение большее или равное 0 – при нормальном завершении. Системные вызовы, возвращающие указатели, обычно для идентификации ошибочной ситуации пользуются значением NULL. Для точного определения причины ошибки C-интерфейс предоставляет глобальную переменную errno, описанную в файле <errno.h> вместе с ее возможными значениями и их краткими определениями. Заметим, что анализировать значение переменной errno необходимо сразу после возникновения ошибочной ситуации, так как успешно завершившиеся системные вызовы не изменяют ее значения. Для получения символьной информации об ошибке на стандартном выводе программы для ошибок (по умолчанию экран терминала) может применяться стандартная UNIX-функция perror().


Функция perror()
Прототип функции
#include <stdio.h>
void perror(char *str);
Описание функции
Функция perror() предназначена для вывода сообщения об ошибке, соответствующего значению системной переменной errno на стандартный поток вывода ошибок. Функция печатает содержимое строки str (если параметр str не равен NULL), двоеточие, пробел и текст сообщения, соответствующий возникшей ошибке, с последующим символом перевода строки ('\n').

Понятия login и password

Операционная система UNIX является многопользовательской операционной системой. Для обеспечения безопасной работы пользователей и целостности системы доступ к ней должен быть санкционирован. Для каждого пользователя, которому разрешен вход в систему, заводится специальное регистрационное имя – username или login и сохраняется специальный пароль – password, соответствующий этому имени. Как правило, при заведении нового пользователя начальное значение пароля для него задает системный администратор. После первого входа в систему пользователь должен изменить начальное значение пароля с помощью специальной команды. В дальнейшем он может в любой момент изменить пароль по своему желанию.
«Узнайте у своего системного администратора» регистрационные имена и пароли, установленные для обучающихся.
Вход в систему и смена пароля
Настало время первый раз войти в систему. Если в системе установлена графическая оболочка наряду с обычными алфавитно-цифровыми терминалами, лучше всего это сделать с алфавитно-цифрового терминала или его эмулятора. На экране появляется надпись, предлагающая ввести регистрационное имя, как правило, это «login:». Набрав свое регистрационное имя, нажмите клавишу <Enter>. Система запросит у вас пароль, соответствующий введенному имени, выдав специальное приглашение – обычно «Password:». Внимательно наберите пароль, установленный для вас системным администратором, и нажмите клавишу <Enter>. Вводимый пароль на экране не отображается, поэтому набирайте его аккуратно! Если все было сделано правильно, у вас на экране появится приглашение к вводу команд операционной системы.
Пароль, установленный системным администратором, необходимо сменить. «Узнайте у своего системного администратора», какая команда для этого используется на вашей вычислительной системе (чаще всего это команда passwd или yppasswd). В большинстве UNIX-образных систем требуется, чтобы новый пароль имел не менее шести символов и содержал, по крайней мере, две не буквы и две не цифры. «Узнайте у своего системного администратора», какие ограничения на новый пароль существуют в вашей операционной системе.
Придумайте новый пароль и хорошенько его запомните, а лучше запишите. Пароли в операционной системе хранятся в закодированном виде, и если вы его забыли, никто не сможет помочь вам его вспомнить. Единственное, что может сделать системный администратор, так это установить вам новый пароль. «Узнайте у своего системного администратора», что нужно предпринять, если вы забыли пароль.
Введите команду для смены пароля. Обычно система просит сначала набрать старый пароль, затем ввести новый и подтвердить правильность его набора повторным введением. После смены пароля уже никто посторонний не сможет войти в систему под вашим регистрационным именем.
Congratulations!!! Теперь Вы полноценный пользователь операционной системы UNIX.
Упрощенное понятие об устройстве файловой системы в UNIX. Полные и относительные имена файлов
В операционной системе UNIX существует три базовых понятия: «процесс», «файл» и «пользователь». С понятием «пользователь» мы только что уже столкнулись и будем сталкиваться в дальнейшем при изучении работы операционной системы UNIX. Понятие «процесс» характеризует динамическую сторону происходящего в вычислительной системе, оно будет подробно обсуждаться в лекции 2 и в описании последующих семинаров. Понятие «файл» характеризует статическую сторону вычислительной системы.
Из предыдущего опыта работы с вычислительной техникой вы уже имеете некоторое представление о файле, как об именованном наборе данных, хранящемся где-нибудь на магнитных дисках или лентах. Для нашего сегодняшнего обсуждения нам достаточно такого понимания, чтобы разобраться в том, как организована работа с файлами в операционной системе UNIX. Более подробное рассмотрение понятия «файл» и организации файловых систем для операционных систем в целом будет приведено в лекции 11 и лекции 12, а также на семинарах 11–12, посвященных организации файловых систем в UNIX.
Все файлы, доступные в операционной системе UNIX, как и в уже известных вам операционных системах, объединяются в древовидную логическую структуру. Файлы могут объединяться в каталоги или директории. Не существует файлов, которые не входили бы в состав какой-либо директории. Директории в свою очередь могут входить в состав других директорий. Допускается существование пустых директорий, в которые не входит ни один файл, и ни одна другая директория. Среди всех директорий существует только одна директория, которая не входит в состав других директорий – ее принято называть корневой. На настоящем уровне нашего незнания UNIX мы можем заключить, что в файловой системе UNIX присутствует, по крайней мере, два типа файлов: обычные файлы, которые могут содержать тексты программ, исполняемый код, данные и т.д. – их принято называть регулярными файлами, и директории.
Каждому файлу (регулярному или директории) должно быть присвоено имя. В различных версиях операционной системы UNIX существуют те или иные ограничения на построение имени файла. В стандарте POSIX на интерфейс системных вызовов для операционной системы UNIX содержится лишь три явных ограничения:

  • Нельзя создавать имена большей длины, чем это предусмотрено операционной системой (для Linux – 255 символов).
  • Нельзя использовать символ NUL (не путать с указателем NULL!) – он же символ с нулевым кодом, он же признак конца строки в языке C.
  • Нельзя использовать символ '/'.

От себя добавим, что также нежелательно применять символы «звездочка» – «*», «знак вопроса» – «?», «кавычка» – «\"», «апостроф» – «\'», «пробел» – « » и «обратный слэш» – «\\»(символы записаны в нотации символьных констант языка C).
Единственным исключением является корневая директория, которая всегда имеет имя «/». Эта же директория по вполне понятным причинам представляет собой единственный файл, который должен иметь уникальное имя во всей файловой системе. Для всех остальных файлов имена должны быть уникальными только в рамках той директории, в которую они непосредственно входят. Каким же образом отличить два файла с именами «aaa.c», входящими в директории «b» и «c» на рисунке 1–2.1, чтобы было понятно о каком из них идет речь? Здесь на помощь приходит понятие полного имени файла.
Давайте мысленно построим путь от корневой вершины дерева файлов к интересующему нас файлу и выпишем все имена файлов (т.е. узлов дерева), встречающиеся на нашем пути, например, «/ usr b aaa.c». В этой последовательности первым будет всегда стоять имя корневой директории, а последним – имя интересующего нас файла. Отделим имена узлов друг от друга в этой записи не пробелами, а символами «/», за исключением имени корневой директории и следующего за ним имени («/usr/b/aaa.c»). Полученная запись однозначно идентифицирует файл во всей логической конструкции файловой системы. Такая запись и получила название полного имени файла.
Понятие о текущей директории. Команда pwd. Относительные имена файлов
Полные имена файлов могут включать в себя достаточно много имен директорий и быть очень длинными, с ними не всегда удобно работать. В то же время, существуют такие понятия как текущая или рабочая директория и относительное имя файла.
Для каждой работающей программы в операционной системе, включая командный интерпретатор (shell), который обрабатывает вводимые команды и высвечивает приглашение к их вводу, одна из директорий в логической структуре файловой системы назначается текущей или рабочей для данной программы. Узнать, какая директория является текущей для вашего командного интерпретатора, можно с помощью команды операционной системы pwd.


Команда pwd
Синтаксис команды
pwd
Описание команды
Команда pwd выводит полное имя текущей директории для работающего командного интерпретатора.

Зная текущую директорию, мы можем проложить путь по графу файлов от текущей директории к интересующему нас файлу. Запишем последовательность узлов, которые встретятся на этом пути, следующим образом. Узел, соответствующий текущей директории, в запись не включаем. При движении по направлению к корневому каталогу каждый узел будем обозначать двумя символами «точка» – «..», а при движении по направлению от корневого каталога будем записывать имя встретившегося узла. Разделим обозначения, относящиеся к разным узлам в этой записи, символами «/». Полученную строку принято называть относительным именем файла. Относительные имена файлов меняются при смене рабочего каталога. Так, в нашем примере, если рабочий каталог – это директория «/d» , то для файла «/usr/b/aaa.c» относительным именем будет «../usr/b/aaa.c», а если рабочий каталог – это директория «/usr/b», то его относительное имя – «ааа.с».
Для полноты картины имя текущего каталога можно вставлять в относительное имя файла, обозначая текущий каталог одиночным символом «точка» – «.». Тогда наши относительные имена будут выглядеть как «./../usr/b/aaa.c» и «./aaa.c» соответственно.
Программы, запущенные с помощью командного интерпретатора, будут иметь в качестве рабочей директории его рабочую директорию, если внутри этих программ не изменить ее расположение с помощью специального системного вызова.
Домашняя директория пользователя и ее определение
Для каждого нового пользователя в системе заводится специальная директория, которая становится текущей сразу после его входа в систему. Эта директория получила название домашней директории пользователя. Воспользуйтесь командой pwd для определения своей домашней директории.


Команда man – универсальный справочник
По ходу изучения операционной системы UNIX вам часто будет требоваться информация о том, что делает та или иная команда или системный вызов, какие у них параметры и опции, для чего предназначены некоторые системные файлы, каков их формат и т.д. Мы постарались, по мере возможности, включить описания большинства используемых в курсе команд и системных вызовов в наш текст. Однако иногда для получения более полной информации мы отсылаем читателей к UNIX Manual – руководству по операционной системе UNIX. К счастью, большая часть информации в UNIX Manual доступна в интерактивном режиме с помощью утилиты man.
Пользоваться утилитой man достаточно просто – наберите команду
man имя
где имя – это имя интересующей вас команды, утилиты, системного вызова, библиотечной функции или файла. Попробуйте с ее помощью посмотреть информацию о команде pwd.
Чтобы пролистать страницу полученного описания, если оно не поместилось на экране полностью, следует нажать клавишу <пробел>. Для прокрутки одной строки воспользуйтесь клавишей <Enter>. Вернуться на страницу назад позволит одновременное нажатие клавиш <Ctrl> и <b>. Выйти из режима просмотра информации можно с помощью клавиши <q>.
Иногда имена команд интерпретатора и системных вызовов или какие-либо еще имена совпадают. Тогда чтобы найти интересующую вас информацию, необходимо задать утилите man категорию, к которой относится эта информация (номер раздела). Деление информации по категориям может слегка отличаться от одной версии UNIX к другой. В Linux, например, принято следующее разделение:
  1. Исполняемые файлы или команды интерпретатора.
  2. Системные вызовы.
  3. Библиотечные функции.
  4. Специальные файлы (обычно файлы устройств) – что это такое, вы узнаете на семинарах 13–14.
  5. Формат системных файлов и принятые соглашения.
  6. Игры (обычно отсутствуют).
  7. Макропакеты и утилиты – такие как сам man.
  8. Команды системного администратора.
  9. Подпрограммы ядра (нестандартный раздел).

Если вы знаете раздел, к которому относится информация, то утилиту man можно вызвать в Linux с дополнительным параметром
man номер_раздела имя
В других операционных системах этот вызов может выглядеть иначе. Для получения точной информации о разбиении на разделы, форме указания номера раздела и дополнительных возможностях утилиты man наберите команду
man man
Команды cd – для смены текущей директории и ls – для просмотра состава директории
Для смены текущей директории командного интерпретатора можно воспользоваться командой cd (change directory). Для этого необходимо набрать команду в виде
cd имя_директории
где имя_директории – полное или относительное имя директории, которую вы хотите сделать текущей. Команда cd без параметров сделает текущей директорией вашу домашнюю директорию.
Просмотреть содержимое текущей или любой другой директории можно, воспользовавшись командой ls (от list). Если ввести ее без параметров, эта команда распечатает вам список файлов, находящихся в текущей директории. Если же в качестве параметра задать полное или относительное имя директории:
ls имя_директории
то она распечатает список файлов в указанной директории. Надо отметить, что в полученный список не войдут файлы, имена которых начинаются с символа «точка» – «.». Такие файлы обычно создаются различными системными программами для своих целей (например, для настройки). Посмотреть полный список файлов можно, дополнительно указав команде ls опцию -a, т.е. набрав ее в виде
ls -a
или
ls -a имя_директории
У команды ls существует и много других опций, часть из которых мы еще рассмотрим на семинарах. Для получения полной информации о команде ls воспользуйтесь утилитой man.
Путешествие по структуре файловой системы
Пользуясь командами cd, ls и pwd, попутешествуйте по структуре файловой системы и просмотрите ее содержимое. Возможно, зайти в некоторые директории или посмотреть их содержимое вам не удастся. Это связано с работой механизма защиты файлов и директорий, о котором мы поговорим позже. Не забудьте в конце путешествия вернуться в свою домашнюю директорию.
Команда cat и создание файла. Перенаправление ввода и вывода
Мы умеем перемещаться по логической структуре файловой системы и рассматривать ее содержимое. Хотелось бы уметь еще и просматривать содержимое файлов, и создавать их. Для просмотра содержимого небольшого текстового файла на экране можно воспользоваться командой cat. Если набрать ее в виде
cat имя_файла
то на экран выплеснется все его содержимое.
Внимание! Не пытайтесь рассматривать на экране содержимое директорий – все равно не получится! Не пытайтесь просматривать содержимое неизвестных файлов, особенно если вы не знаете, текстовый он или бинарный. Вывод на экран бинарного файла может привести к непредсказуемому поведению вашего терминала.
Если даже ваш файл и текстовый, но большой, то все равно вы увидите только его последнюю страницу. Большой текстовый файл удобнее рассматривать с помощью утилиты more (описание ее использования вы найдете в UNIX Manual). Команда cat будет нам интересна с другой точки зрения.
Если мы в качестве параметров для команды cat зададим не одно имя, а имена нескольких файлов
cat файл1 файл2 ... файлN
то система выдаст на экран их содержимое в указанном порядке. Вывод команды cat можно перенаправить с экрана терминала в какой-нибудь файл, воспользовавшись символом перенаправления выходного потока данных – знаком «больше» – «>». Команда
cat файл1 файл2 ... файлN > файл_результата
сольет содержимое всех файлов, чьи имена стоят перед знаком «>», воедино в файл_результата – конкатенирует их (от слова concatenate и произошло ее название). Прием перенаправления выходных данных со стандартного потока вывода (экрана) в файл является стандартным для всех команд, выполняемых командным интерпретатором. Вы можете получить файл, содержащий список всех файлов текущей директории, если выполните команду ls -a с перенаправлением выходных данных
ls -a > новый_файл
Если имена входных файлов для команды cat не заданы, то она будет использовать в качестве входных данных информацию, которая вводится с клавиатуры, до тех пор, пока вы не наберете признак окончания ввода – комбинацию клавиш <CTRL> и <d>.
Таким образом, команда
cat > новый_файл
позволяет создать новый текстовый файл с именем новый_файл и содержимым, которое пользователь введет с клавиатуры. У команды cat существует множество различных опций. Посмотреть ее полное описание можно в UNIX Manual.
Заметим, что наряду с перенаправлением выходных данных существует способ перенаправить входные данные. Если во время выполнения некоторой команды требуется ввести данные с клавиатуры, можно положить их заранее в файл, а затем перенаправить стандартный ввод этой команды с помощью знака «меньше» – «<» и следующего за ним имени файла с входными данными. Другие варианты перенаправления потоков данных можно посмотреть в UNIX Manual для командного интерпретатора.
Создание файла с помощью команды cat
Убедитесь, что вы находитесь в своей домашней директории, и создайте с помощью команды cat новый текстовый файл. Просмотрите его содержимое.

Простейшие команды работы с файлами – cp, rm, mkdir, mv
Для нормальной работы с файлами необходимо не только уметь создавать файлы, просматривать их содержимое и перемещаться по логическому дереву файловой системы. Нужно уметь создавать собственные поддиректории, копировать и удалять файлы, переименовывать их. Это минимальный набор операций, не владея которым нельзя чувствовать себя уверенно при работе с компьютером.
Для создания новой поддиректории используется команда mkdir (сокращение от make directory). В простейшем виде команда выглядит следующим образом:
mkdir имя_директории
где имя_директории – полное или относительное имя создаваемой директории. У команды mkdir имеется набор опций, описание которых можно просмотреть с помощью утилиты man.


Команда cp
Синтаксис команды
cp файл_источник файл_назначения
cp файл1 файл2 ... файлN дир_назначения
cp -r дир_источник дир_назначения
cp -r дир1 дир2 ... дирN дир_назначения
Описание команды
Настоящее описание является не полным описанием команды cp, а кратким введением в ее использование. Для получения полного описания команды обратитесь к UNIX Manual.
Команда cp в форме
cp файл_источник файл_назначения
служит для копирования одного файла с именем файл_источник в файл с именем файл_назначения.
Команда cp в форме
cp файл1 файл2 ... файлN дир_назначения
служит для копирования файла или файлов с именами файл1, файл2, ... файлN в уже существующую директорию с именем дир_назначения под своими именами. Вместо имен копируемых файлов могут использоваться их шаблоны.
Команда cp в форме
cp -r дир_источник дир_назначения
служит для рекурсивного копирования одной директории с именем дир_источник в новую директорию с именем дир_назначения. Если директория дир_назначения уже существует, то мы получаем команду cp в следующей форме
cp -r дир1 дир2 ... дирN дир_назначения
Такая команда служит для рекурсивного копирования директории или директорий с именами дир1, дир2, ... дирN в уже существующую директорию с именем дир_назначения под своими собственными именами. Вместо имен копируемых директорий могут использоваться их шаблоны.

Для копирования файлов может использоваться команда cp (сокращение от copy). Команда ср умеет копировать не только отдельный файл, но и набор файлов, и даже директорию целиком вместе со всеми входящими в нее поддиректориями (рекурсивное копирование). Для задания набора файлов могут использоваться шаблоны имен файлов. Точно так же шаблон имени может быть использован и в командах переименования файлов и их удаления, которые мы рассмотрим ниже.


Шаблоны имен файлов
Шаблоны имен файлов могут применяться в качестве параметра для задания набора имен файлов во многих командах операционной системы. При использовании шаблона просматривается вся совокупность имен файлов, находящихся в файловой системе, и те имена, которые удовлетворяют шаблону, включаются в набор. В общем случае шаблоны могут задаваться с использованием следующих метасимволов:
* – соответствует всем цепочкам литер, включая пустую;
? – соответствует всем одиночным литерам;
[...] – соответствует любой литере, заключенной в скобки. Пара литер, разделенных знаком минус, задает диапазон литер.
Так, например, шаблону *.c удовлетворяют все файлы текущей директории, чьи имена заканчиваются на .c. Шаблону [a-d]* удовлетворяют все файлы текущей директории, чьи имена начинаются с букв a, b, c, d. Существует одно ограничение на использование метасимвола * в начале имени файла, например, в случае шаблона *c. Для таких шаблонов имена файлов, начинающиеся с символа точка, считаются не удовлетворяющими шаблону.

Для удаления файлов или директорий применяется команда rm (сокращение от remove). Если вы хотите удалить один или несколько регулярных файлов, то простейший вид команды rm будет выглядеть следующим образом:
rm файл1 файл2 ... файлN
где файл1, файл2, ... файлN – полные или относительные имена регулярных файлов, которые требуется удалить. Вместо имен файлов могут использоваться их шаблоны. Если вы хотите удалить одну или несколько директорий вместе с их содержимым (рекурсивное удаление), то к команде добавляется опция -r:
rm -r дир1 дир2 ... дирN
где дир1, дир2, ... дирN – полные или относительные имена директорий, которые нужно удалить. Вместо непосредственно имен директорий также могут использоваться их шаблоны. У команды rm есть еще набор полезных опций, которые описаны в UNIX Manual. На самом деле процесс удаления файлов не так прост, как кажется на первый взгляд. Более подробно он будет рассмотрен нами на семинарах 11–12, когда мы будем обсуждать операции над файлами в операционной системе UNIX.


Команда mv
Синтаксис команды
mv имя_источника имя_назначения
mv имя1 имя2 ... имяN дир_назначения
Описание команды
Настоящее описание не является полным описанием команды mv, а служит кратким введением в ее использование. Для получения полного описания команды обращайтесь к UNIX Manual.
Команда mv в форме
mv имя_источника имя_назначения
служит для переименования или перемещения одного файла (неважно, регулярного или директории) с именем имя_источника в файл с именем имя_назначения. При этом перед выполнением команды файла с именем имя_назначения существовать не должно.
Команда mv в форме
mv имя1 имя2 ... имяN дир_назначения
служит для перемещения файла или файлов (неважно, регулярных файлов или директорий) с именами имя1, имя2, ... имяN в уже существующую директорию с именем дир_назначения под собственными именами. Вместо имен перемещаемых файлов могут использоваться их шаблоны.

Командой удаления файлов и директорий следует пользоваться с осторожностью. Удаленную информацию восстановить невозможно. Если вы системный администратор и ваша текущая директория – это корневая директория, пожалуйста, не выполняйте команду rm -r *!
Для переименования файла или его перемещения в другой каталог применяется команда mv (сокращение от move). Для задания имен перемещаемых файлов в ней тоже можно использовать их шаблоны.
История редактирования файлов – ed, vi
Полученные знания уже позволяют нам достаточно свободно оперировать файлами. Но что нам делать, если потребуется изменить содержимое файла, отредактировать его?
Когда появились первые варианты операционной системы UNIX, устройства ввода и отображения информации существенно отличались от существующих сегодня. На клавиатурах присутствовали только алфавитно-цифровые клавиши (не было даже клавиш курсоров), а дисплеи не предполагали экранного редактирования. Поэтому первый редактор операционной системы UNIX – редактор ed – требовал от пользователя строгого указания того, что и как будет редактироваться с помощью специальных команд. Так, например, для замены первого сочетания символов «ra» на «ru» в одиннадцатой строке редактируемого файла потребовалось бы ввести команду
11 s/ra/ru
Редактор ed, по существу, являлся построчечным редактором. Впоследствии появился экранный редактор – vi, однако и он требовал строгого указания того, что и как в текущей позиции на экране мы должны сделать, или каким образом изменить текущую позицию, с помощью специальных команд, соответствующих алфавитно-цифровым клавишам. Эти редакторы могут показаться нам сейчас анахронизмами, но они до сих пор входят в состав всех вариантов UNIX и иногда (например, при работе с удаленной машиной по медленному каналу связи) являются единственным средством, позволяющим удаленно редактировать файл.
Система Midnight Commander – mc. Встроенный mc редактор и редактор joe
Наверное, вы уже убедились в том, что работа в UNIX исключительно на уровне командного интерпретатора и встроенных редакторов далека от уже привычных для нас удобств. Но не все так плохо. Существует разнообразные пакеты, облегчающие задачу пользователя в UNIX. К таким пакетам следует отнести Midnight Commander – аналог программ Norton Commander для DOS и FAR для Windows 9x и NT – со своим встроенным редактором, запускаемый командой mc, и экранный редактор joe. Информацию о них можно найти в UNIX Manual. Большими возможностями обладают многофункциональные текстовые редакторы, например, emacs.
Войдите в mc и попробуйте перемещаться по директориям, создавать и редактировать файлы.

Пользователь и группа. Команды chown и chgrp. Права доступа к файлу
Как уже говорилось, для входа в операционную систему UNIX каждый пользователь должен быть зарегистрирован в ней под определенным именем. Вычислительные системы не умеют оперировать именами, поэтому каждому имени пользователя в системе соответствует некоторое числовое значение – его идентификатор – UID (user identificator).
Все пользователи в системе делятся на группы. Например, студенты одной учебной группы могут составлять отдельную группу пользователей. Группы пользователей также получают свои имена и соответствующие идентификационные номера – GID (group identificator). В одних версиях UNIX каждый пользователь может входить только в одну группу, в других – в несколько групп.


Команда chown
Синтаксис команды
chown owner файл1 файл2 ... файлN
Описание команды
Команда chown предназначена для изменения собственника (хозяина) файлов. Настоящее описание не является полным описанием команды, а адаптировано применительно к данному курсу. Для получения полного описания обращайтесь к UNIX Manual. Нового собственника файла могут назначить только предыдущий собственник файла или системный администратор.
Параметр owner задает нового собственника файла в символьном виде, как его username,или в числовом виде, как его UID.
Параметры файл1, файл2, ... файлN – это имена файлов, для которых производится изменение собственника. Вместо имен могут использоваться их шаблоны.

Для каждого файла, созданного в файловой системе, запоминаются имена его хозяина и группы хозяев. Заметим, что группа хозяев не обязательно должна быть группой, в которую входит хозяин. Упрощенно можно считать, что в операционной системе Linux при создании файла его хозяином становится пользователь, создавший файл, а его группой хозяев – группа, к которой этот пользователь принадлежит. Впоследствии хозяин файла или системный администратор могут передать его в собственность другому пользователю или изменить его группу хозяев с помощью команд chown и chgrp, описание которых можно найти в UNIX Manual.


Команда chgrp
Синтаксис команды
chgrp group файл1 файл2 ... файлN
Описание команды
Команда chgrp предназначена для изменения группы собственников (хозяев) файлов. Настоящее описание не является полным описанием команды, а адаптировано применительно к данному курсу. Для получения полного описания обращайтесь к UNIX Manual. Новую группу собственников файла могут назначить только собственник файла или системный администратор.
Параметр group задает новую группу собственников файла в символьном виде, как имя группы, или в числовом виде, как ее GID.
Параметры файл1, файл2, ... файлN – это имена файлов, для которых производится изменение группы собственников. Вместо имен могут использоваться их шаблоны.

Как мы видим, для каждого файла выделяется три категории пользователей:

  • Пользователь, являющийся хозяином файла;
  • Пользователи, относящиеся к группе хозяев файла;
  • Все остальные пользователи.

Для каждой из этих категорий хозяин файла может определить различные права доступа к файлу. Различают три вида прав доступа: право на чтение файла – r (от слова read), право на модификацию файла – w (от слова write) и право на исполнение файла — x (от слова execute). Для регулярных файлов смысл этих прав совпадает с указанным выше. Для директорий он несколько иной. Право чтения для каталогов позволяет читать имена файлов, находящихся в этом каталоге (и только имена). Поскольку «исполнять» директорию бессмысленно (как, впрочем, и неисполняемый регулярный файл), право доступа на исполнение для директорий меняет смысл: наличие этого права позволяет получить дополнительную информацию о файлах, входящих в каталог (их размер, кто их хозяин, дата создания и т.д.). Без этого права вы не сможете ни читать содержимое файлов, лежащих в директории, ни модифицировать их, ни исполнять. Право на исполнение также требуется для директории, чтобы сделать ее текущей, а также для всех директорий на пути к ней. Право записи для директории позволяет изменять ее содержимое: создавать и удалять в ней файлы, переименовывать их. Отметим, что для удаления файла достаточно иметь права записи и исполнения для директории, в которую входит данный файл, независимо от прав доступа к самому файлу.
Команда ls с опциями -al. Использование команд chmod и umask
Получить подробную информацию о файлах в некоторой директории, включая имена хозяина, группы хозяев и права доступа, можно с помощью уже известной нам команды ls с опциями -al. В выдаче этой команды третья колонка слева содержит имена пользователей хозяев файлов, а четвертая колонка слева – имена групп хозяев файла. Самая левая колонка содержит типы файлов и права доступа к ним. Тип файла определяет первый символ в наборе символов. Если это символ 'd', то тип файла – директория, если там стоит символ '-', то это – регулярный файл. Следующие три символа определяют права доступа для хозяина файла, следующие три – для пользователей, входящих в группу хозяев файла, и последние три – для всех остальных пользователей. Наличие символа (r, w или x), соответствующего праву, для некоторой категории пользователей означает, что данная категория пользователей обладает этим правом.
Вызовите команду ls-al для своей домашней директории и проанализируйте ее выдачу.


Команда chmod
Синтаксис команды
chmod [who] { + | – | = } [perm]
файл1 файл2 ... файлN
Описание команды
Команда chmod предназначена для изменения прав доступа к одному или нескольким файлам. Настоящее описание не является полным описанием команды, а адаптировано применительно к данному курсу. Для получения полного описания обращайтесь к UNIX Manual. Права доступа к файлу могут менять только собственник (хозяин) файла или системный администратор.
Параметр who определяет, для каких категорий пользователей устанавливаются права доступа. Он может представлять собой один или несколько символов:
a – установка прав доступа для всех категорий пользователей. Если параметр who не задан, то по умолчанию применяется a. При определении прав доступа с этим значением заданные права устанавливаются с учетом значения маски создания файлов;
u – установка прав доступа для собственника файла;
g – установка прав доступа для пользователей, входящих в группу собственников файла;
O – установка прав доступа для всех остальных пользователей.
Операция, выполняемая над правами доступа для заданной категории пользователей, определяется одним из следующих символов:
+ – добавление прав доступа;
- – отмена прав доступа;
= – замена прав доступа, т.е. отмена всех существовавших и добавление перечисленных.
Если параметр perm не определен, то все существовавшие права доступа отменяются.
Параметр perm определяет права доступа, которые будут добавлены, отменены или установлены взамен соответствующей командой. Он представляет собой комбинацию следующих символов или один из них:
r – право на чтение;
w – право на модификацию;
x – право на исполнение.
Параметры файл1, файл2, ... файлN – это имена файлов, для которых производится изменение прав доступа. Вместо имен могут использоваться их шаблоны.

Хозяин файла может изменять права доступа к нему, пользуясь командой chmod.
Создайте новый файл и посмотрите на права доступа к нему, установленные системой при его создании. Чем руководствуется операционная система при назначении этих прав? Она использует для этого маску создания файлов для программы, которая файл создает. Изначально для программы-оболочки она имеет некоторое значение по умолчанию.


Маска создания файлов текущего процесса
Маска создания файлов текущего процесса (umask) используется системными вызовами open() и mknod() при установке начальных прав доступа для вновь создаваемых файлов или FIFO. Младшие 9 бит маски создания файлов соответствуют правам доступа пользователя, создающего файл, группы, к которой он принадлежит, и всех остальных пользователей так, как записано ниже с применением восьмеричных значений:
0400 – право чтения для пользователя, создавшего файл;
0200 – право записи для пользователя, создавшего файл;
0100 – право исполнения для пользователя, создавшего файл;
0040 – право чтения для группы пользователя, создавшего файл;
0020 – право записи для группы пользователя, создавшего файл;
0010 – право исполнения для группы пользователя, создавшего файл;
0004 – право чтения для всех остальных пользователей;
0002 – право записи для всех остальных пользователей;
0001 – право исполнения для всех остальных пользователей.
Установление значения какого-либо бита равным 1 запрещает инициализацию соответствующего права доступа для вновь создаваемого файла. Значение маски создания файлов может изменяться с помощью системного вызова umask() или команды umask. Маска создания файлов наследуется процессом-ребенком при порождении нового процесса системным вызовом fork() и входит в состав неизменяемой части системного контекста процесса при системном вызове exec(). В результате этого наследования изменение маски с помощью команды umask окажет влияние на атрибуты доступа к вновь создаваемым файлам для всех процессов, порожденных далее командной оболочкой.

Изменить текущее значение маски для программы-оболочки или посмотреть его можно с помощью команды umask.


Команда umask
Синтаксис команды
umask [value]
Описание команды
Команда umask предназначена для изменения маски создания файлов командной оболочки или просмотра ее текущего значения. При отсутствии параметра команда выдает значение установленной маски создания файлов в восьмеричном виде. Для установления нового значения оно задается как параметр value в восьмеричном виде.

Если вы хотите изменить его для Midnight Commander, необходимо выйти из mc, выполнить команду umask и запустить mc снова. Маска создания файлов не сохраняется между сеансами работы в системе. При новом входе в систему значение маски снова будет установлено по умолчанию.

Системные вызовы getuid и getgid
Узнать идентификатор пользователя, запустившего программу на исполнение, – UID и идентификатор группы, к которой он относится, – GID можно с помощью системных вызовов getuid() и getgid(), применив их внутри этой программы.


Системные вызовы getuid() и getgid()
Прототипы системных вызовов
#include <sys/types.h>
#include <unistd.h>
uid_t getuid(void);
gid_t getgid(void);
Описание системных вызовов
Системный вызов getuid возвращает идентификатор пользователя для текущего процесса.
Системный вызов getgid возвращает идентификатор группы пользователя для текущего процесса.
Типы данных uid_t и gid_t являются синонимами для одного из целочисленных типов языка C.

Компиляция программ на языке C в UNIX и запуск их на счет
Теперь мы готовы к тому, чтобы написать первую программу в нашем курсе. Осталось только научиться компилировать программы на языке C и запускать их на счет. Для компиляции программ в Linux мы будем применять компилятор gcc.
Для того чтобы он нормально работал, необходимо, чтобы исходные файлы, содержащие текст программы, имели имена, заканчивающиеся на .c.
В простейшем случае откомпилировать программу можно, запуская компилятор командой
gcc имя_исходного_файла
Если программа была написана без ошибок, то компилятор создаст исполняемый файл с именем a.out. Изменить имя создаваемого исполняемого файла можно, задав его с помощью опции -o:
gcc имя_исходного_файла -o
имя_исполняемого_файла
Компилятор gcc имеет несколько сотен возможных опций. Получить информацию о них вы можете в UNIX Manual.
«Узнайте у своего системного администратора», как называется компилятор с языка C для вашей операционной системы и какие опции он имеет. Обычно во всех версиях UNIX имеется компилятор с именем cc, поддерживающий опцию –о.
Запустить программу на исполнение можно, набрав имя исполняемого файла и нажав клавишу <Enter>.
Написание, компиляция и запуск программы c использованием системных вызовов getuid() и getgid()
Напишите, откомпилируйте и запустите программу, которая печатала бы идентификатор пользователя, запустившего программу, и идентификатор его группы.

 

 
На главную | Содержание | < Назад....Вперёд >
С вопросами и предложениями можно обращаться по nicivas@bk.ru. 2013 г.Яндекс.Метрика