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

(Основываются на лекции 1)

Программа курса | Следующий семинар

Программа семинаров

  1. Введение в курс практических занятий.
  2. Краткая история операционной системы UNIX, ее структура.
  3. Системные вызовы и библиотека libc.
  4. Понятия login'а & password'а.
  5. Упрощенное понятие об устройстве файловой системы в UNIX. Полные имена файлов.
  6. Понятие о текущей директории. Команда pwd. Относительные имена файлов.
  7. Домашняя директория пользователя и ее определение.
  8. Команда man - универсальный справочник.
  9. Команды cd - смены текущей директории и ls - просмотра состава директории.
  10. Команда cat и создание файла. Перенаправление ввода и вывода.
  11. Простейшие команды работы с файлами - cp, rm, mkdir, mv.
  12. История редактирования файлов - ed, sed, vi.
  13. Система Midnight Commander - mc. Встроенный mc редактор и редактор joe.
  14. Пользователь и группа. Команды chown и chgrp. Права доступа к файлу.
  15. Команда ls с опциями -al. Использование команд chmod и umask..
  16. Системные вызовы getuid и getgid.
  17. Компиляция программ на языке C в UNIX и запуск их на счет.

Цели занятия

  1. Научить студента входить в систему. Объяснить понятия login'а & password'а. Какие они и у кого? Как сменить пароли?
  2. Дать начальное понятие об устройстве файловой системы в UNIX, о полных и относительных именах файлов. Научить выполнять простейшие команды работы с файловой системой и пользоваться командой man.
  3. Научить студента создавать и редактировать файлы.
  4. Научить компилировать программу на языке С и запускать ее на исполнение.
  5. Разъяснить соотношение между пользователем и группой, как пользоваться командой chmod.

Практические работы

  1. Вход в систему и смена пароля.
  2. Домашняя директория пользователя и ее определение.
  3. Команда man - универсальный справочник.
  4. Путешествие по директорной структуре.
  5. Создание файла с помощью команды cat.
  6. Система Midnight Commander - mc. Встроенный mc редактор и редактор joe.
  7. Команда ls с опциями -al. Использование команд chmod и umask..
  8. Написание, компиляция и запуск программы с использованием системных вызовов getuid() и getgid().

План занятия

  1. Введение в курс практических занятий.

    Настоящий курс практических занятий является одной из первых известных авторам попыток систематически проиллюстрировать лекционный курс "Введение в операционные системы" на примере конкретной операционной системы, а именно - операционной системы UNIX.

    Необходимость систематического изложения материала семинарских и практических занятий с тесной увязкой с материалом лекций всплыла перед авторами в процессе становления базового 4-х семестрового набора курсов по информатике в МФТИ. Новизна излагаемого материала для многих преподавателей и отсутствие опыта его преподавания  заставили лекторов для соблюдения некоторого стандарта обучения готовить по каждой теме методические указания для семинаристов, которые, как показал опыт, могут быть с успехом использованы и студентами. Обкатанная версия этих методических указаний, расширенная, дополненная и модифицированная по результатам многочисленных обсуждений находится перед вами.

    Семестровый курс "Введение в операционные системы" является третьим по счету курсом цикла "Информатика", которому предшествуют курсы "Алгоритмы и алгоритмические языки" и "Архитектура ЭВМ и язык ассемблера". Предполагается, что к началу практических занятий этого курса студенты умеют программировать на языке С (с использованием функций стандартной библиотеки для работы с файлами и строками) и имеют представление о внутреннем устройстве ЭВМ.

    Переход от обучения студентов информатике с использованием mainfram'ов к обучению с использованием сетевых классов персональных компьютеров, свершившийся за последние двадцать лет, неизбежно наложил свой отпечаток на форму проведения практических занятий. Вместо раздельного проведения семинаров и практикума (лабораторных работ) появилось нечто смешанное - семинарский практикум или практический семинар, когда изложение нового материала неоднократно чередуется с короткими практическими программными работами, направленными на его закрепление, в течение одного занятия. Именно в таком виде полу-семинаров, полу-практикумов и построен наш курс. Достаточно высокая сложность используемых программных конструкций подвела к идее использовать готовые примеры программ для иллюстрации рассматриваемых понятий с последующей их модификацией студентами. Это позволило увеличить насыщенность занятий и за семестровый курс охватить большее количество материала.

    Операционная система UNIX была выбрана для иллюстрации лекций ввиду своей открытости, изящности и легкости для понимания, хотя создание подобного практического курса возможно и для других операционных систем, например для Windows NT.

    В целом практический курс включает в себя 16 занятий, одно из которых в середине семестра - семинар 10 - посвящено проведению контрольной работы по материалам лекций. Некоторым темам выделено по 2 занятия, хотя естественно разбиение тем на занятия является достаточно условным, желательно лишь, чтобы они следовали за лекциями, на которых основываются.

    За сим позвольте перейти к изложению материала семинарско-практического курса.

    По своему содержанию материал текущих семинаров 1-2 является наиболее критичным по отношению к используемому виду операционной системы и политике администрирования. Поэтому многие разбираемые вопросы будут содержать ссылку "узнайте у своего системного администратора". Прежде чем приступать к занятиям, необходимо обеспечить наличие пользовательских account'ов для обучающихся. "Узнайте у своего системного администратора" как это сделать.

  2. Краткая история операционной системы UNIX, ее структура.

    На первой лекции мы с вами разобрали содержание понятия "операционная система", обсудили функции операционных систем и способы их построения. Все материалы первой и последующих лекций мы будем иллюстрировать практическими примерами, связанными с использованием одной из разновидностей операционной системы UNIX - операционной системы Linux, хотя рассказ по возможности постараемся не связывать именно с ее особенностями.

    Строение ОС в лекции Ядро операционной системы Linux представляет собой монолитную систему. При компиляции ядра Linux можно разрешить динамическую загрузку и выгрузку очень многих компонент ядра - так называемых модулей. В момент загрузки модуля его код загружается для исполнения в привилегированном режиме и связывается с остальной частью ядра. Внутри модуля могут использоваться любые экспортируемые ядром функции.

    Свой современный вид эта операционная система обрела в результате длительной эволюции UNIX-образных операционных систем. История развития UNIX подробно освещена практически во всей печатной и электронной литературе, посвященной вычислительной технике. Как правило, это во многом один и тот же текст, с небольшими изменениями кочующий из издания в издание, и нам не хотелось бы стать очередными в этой последовательности. Пользуясь электронной формой нашего курса, мы просто сошлемся на достаточно подробное изложение в книге Н.А. Олифер, В.Г. Олифер "Сетевые операционные системы" или на оригинальную работу одного из родоначальников UNIX Dennis M. Ritchie "The Evolution of the Unix Time-sharing System". Достаточно наглядно эволюция UNIX может быть изображена схематически на упрощенной или детальной схеме. Для нас наиболее важным во всей этой истории будет являться существование двух стержневых линий эволюции - линии System V и линии BSD, поскольку в процессе обучения мы будем сталкиваться с различиями в их реализации.

  3. Системные вызовы и библиотека libc.

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

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

    Большинство системных вызовов, возвращающих целое значение, использует значение -1 при возникновении ошибки и значение большее или равное 0 при нормальном завершении. Системные вызовы, возвращающие указатели, обычно для идентификации ошибочной ситуации пользуются значением NULL. Для точного определения причины ошибки C-интерфейс предоставляет глобальную переменную errno, описанную в файле <errno.h> вместе с ее возможными значениями и их краткими определениями. Заметим, что анализировать значение переменной errno необходимо сразу после возникновения ошибочной ситуации, так как успешно завершившиеся системные вызовы не изменяют ее значения. Для получения символьной информации об ошибке на стандартном выводе программы для ошибок (по умолчанию экран вашего терминала) может применяться стандартная UNIX функция perror().
     

  4. Понятия login'а & password'а.

    Операционная система UNIX является многопользовательской операционной системой. Для обеспечения безопасной работы пользователей и целостности системы любой доступ к ней должен быть санкционирован. Для каждого пользователя, которому разрешен вход в систему, заводится специальное регистрационное имя - username или login и сохраняется специальный пароль - password, соответствующий этому имени. Как правило, при заведении нового пользователя начальное значение пароля для него задает системный администратор. После первого входа в систему пользователь должен изменить начальное значение пароля с помощью специальной команды. В дальнейшем он может изменить свой пароль по собственному желанию в произвольный момент времени.

    "Узнайте у своего системного администратора" регистрационные имена и пароли, установленные для обучающихся.
     

  5. Вход в систему и смена пароля.

    Настало время первый раз войти в систему. Если у вас в системе установлена графическая оболочка наряду с обычными алфавитно-цифровыми терминалами, лучше всего впервые это сделать с алфавитно-цифрового терминала или его эмулятора. На экране перед вами горит надпись, предлагающая ввести регистрационное имя, как правило - это "login:". После набора своего регистрационного имени нажмите клавишу <Enter>. Система запросит у вас пароль, соответствующий введенному имени, выдав специальное приглашение - обычно "Password:". Внимательно наберите пароль, установленный для вас системным администратором, и нажмите клавишу <Enter>. Вводимый пароль не отображается на экране, поэтому делайте это аккуратно! Если все было сделано правильно, у вас на экране, в конечном счете, появится приглашение к вводу команд операционной системы.

    Пароль, установленный системным администратором, необходимо сменить на свой собственный. "Узнайте у своего системного администратора", какая команда для этого используется на вашей вычислительной системе. В большинстве UNIX-образных систем требуется, чтобы новый пароль имел не менее 6-и символов и содержал, по крайней мере, две не буквы и две не цифры. "Узнайте у своего системного администратора", какие ограничения на новый пароль существуют в вашей операционной системе. Nota bene Придумайте новый пароль и хорошенько его запомните, а лучше запишите. Пароли в операционной системе хранятся в закодированном виде, и если вы его забыли, никто не сможет помочь вам его вспомнить. Единственное, что может сделать системный администратор, так это установить вам новый пароль. "Узнайте у своего системного администратора", какие организационные действия необходимо предпринять, если вы забыли пароль.

    Введите команду для смены пароля. Обычно вас попросят сначала ввести старый пароль, затем ввести новый и подтвердить правильность его набора повторным введением. Пароли набирайте аккуратно, так как вводимая информация не отображается на экране. После смены пароля уже никто посторонний не сможет войти в систему под вашим регистрационным именем.

    Congratulations!!! Теперь вы полноценные пользователи операционной системы UNIX.
     

  6. Упрощенное понятие об устройстве файловой системы в UNIX. Полные и относительные имена файлов.

    В операционной системе UNIX существует три базовых понятия: "процесс","файл" и "пользователь". С понятием "пользователь" вы только что уже столкнулись и будете сталкиваться в дальнейшем при изучении средств защиты информации в операционной системе UNIX. Понятие "процесс" характеризует динамическую сторону происходящего в вычислительной системе и будет подробно обсуждаться на лекции 2 и на следующих семинарах. Понятие "файл" характеризует статическую сторону вычислительной системы.

    Из предыдущего опыта работы с вычислительной техникой вы уже имеете некоторое представление о файле, как о некотором именованном наборе данных, хранящегося где-нибудь на магнитных дисках или лентах. Для нашего сегоднящнего обсуждения нам достаточно такого понимания, чтобы упрощенно разобраться в том, как организована работа с файлами в операционной системе UNIX. Более аккуратное рассмотрение понятия "файл" и организации файловых систем для операционных систем в целом будет проведено на лекции 11 и лекции 12, а также на соответствующих семинарах, посвященных организации файловых систем в UNIX.

    Все файлы, которые доступны операционной системе UNIX, как и в уже известных вам операционных системах, объединяются в древовидную логическую структуру. Файлы могут объединяться в каталоги или директории. Не существует файлов, которые не входили бы в состав какой-либо директории. Директории в свою очередь могут входить в состав других директорий. Допускается существование пустых директорий, в которые не входит ни один другой файл, и ни одна другая директория (см. рисунок). Среди всех директорий существует только одна директория, которая не входит в состав других директорий - ее принято называть корневой. На настоящем уровне нашего незнания UNIX мы можем заключить, что в файловой системе UNIX присутствует, по крайней мере, 2 типа файлов: обычные файлы, которые могут содержать тексты программ, исполняемый код, данные и т.д. - их принято называть регулярными файлами, и директории.



    Каждому файлу (регулярному или директории) должно быть присвоено имя. В различных версиях операционной системы UNIX существуют различные ограничения на построение имени файла. В стандарте POSIX на интерфейс системных вызовов для операционной системы UNIX содержится лишь три явных ограничения:


    От себя добавим, что также нежелательным является использование символов "звездочка" - '*', "знак вопроса" -'?', "кавычка " -'\"', "апостроф" - '\'', "пробел" - '  ' и "обратный слэш" -'\\' (символы записаны в нотации символьных констант языка C).

    Единственным исключением из перечисленных правил служит корневая директория, которая всегда имеет имя "/". Эта же директория по вполне понятным причинам является единственным файлом, обязанным иметь уникальное имя во всей файловой системе. Для всех остальных файлов имена должны быть уникальными только в рамках той директории, в которую они непосредственно входят. Каким же образом отличить два файла с именами "aaa.c", входящими в директории "b" и "c" на нашем рисунке, чтобы было понятно о каком из них идет речь? Здесь на помощь приходит понятие полного имени файла.

    Давайте мысленно построим путь от корневой вершины нашего дерева файлов к интересующему нас файлу и выпишем все имена файлов (т.е. узлов дерева), встречающиеся на нашем пути, например, "/ usr b aaa.c". В этой последовательности первым будет всегда стоять имя корневой директории, а последним - имя интересующего нас файла. Отделим имена узлов друг от друга в этой записи не пробелами, а символами "/", за исключением имени корневой директории и следующего за ним имени ("/usr/b/aaa.c"). Полученная запись однозначно идентифицирует файл во всей логической конструкции файловой системы. Такая запись и получила название полного имени файла.

  7. Понятие о текущей директории. Команда pwd. Относительные имена файлов.

    Полные имена файлов могут включать в себя достаточно много имен директорий и быть очень длинными, с ними не всегда удобно работать. Тогда на помощь нам могут прийти понятия текущей или рабочей директории и относительного имени файла.

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

    Зная текущую директорию, мы можем проложить путь по графу файлов от текущей директории к интересующему нас файлу. Запишем последовательность узлов, которые встретятся на этом пути следующим образом. Узел, соответствующий текущей директории в запись не включаем. При движении по направлению к корневому каталогу каждый новый встретившийся узел будем обозначать двумя символами "точка" - "..", а при движении по направлению от корневого каталога будем записывать имя встретившегося узла. Разделим обозначения, относящиеся к разным узлам в этой записи символами "/". Полученную строку принято называть относительным именем файла. Относительные имена файлов меняются при смене рабочего каталога. Так, в нашем примере, если рабочий каталог - это директория "/d", то для файла "/usr/b/aaa.c" его относительное имя будет "../usr/b/aaa.c", а если рабочий каталог - это директория "/usr/b", то его относительное имя - "ааа.с".

    Для полноты картины имя текущего каталога можно тоже вставлять в относительное имя файла, обозначая текущий каталог одиночным символом "точка" - ".". Тогда наши относительные имена будут выглядеть как "./../usr/b/aaa.c" и "./aaa.c" соответственно.

    Программы, запущенные вами с помощью командного интерпретатора, будут иметь в качестве рабочей директории его рабочую директорию, если вы внутри этих программ не измените ее расположение с помощью специального системного вызова.
     

  8. Домашняя директория пользователя и ее определение.

    Для каждого нового пользователя в системе заводится специальная директория, которая становится текущей сразу после входа в систему. Эта директория получила название домашней директории пользователя. Воспользуйтесь командой pwd для определения своей домашней директории.
     

  9. Команда man - универсальный справочник.

    По ходу изучения операционной системы UNIX вам часто будет требоваться информация о том, что делает та или иная команда или системный вызов, какие у них параметры и опции, для чего предназначены некоторые системные файлы, и каков их формат и т.д. Мы постарались, по мере возможности, занести для большинства используемых в курсе команд и системных вызовов их описания в наш гипертекст, куда вы можете попасть по соответствующим ссылкам (как, например, здесь для команды pwd), однако иногда для полной информации мы отсылаем вас к UNIX Manual - руководству по операционной системе UNIX. К счастью, большинство информации в UNIX Manual доступно для пользователей в интерактивном режиме с помощью утилиты man. Особенно повезло тем пользователям, которые работают в системе ASPLinux, поскольку в ней многие описания переведены на русский язык (правда, встречаются опечатки)!

    Пользоваться утилитой 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

    Жаль, что даже в ASPLinux эта информация пока на английском языке.
     

  10. Команды cd - смены текущей директории и ls - просмотра состава директории.

    Для смены текущей директории командного интерпретатора можно воспользоваться командой cd от (change directory). Для этого необходимо набрать команду в виде

    cd имя_директории,

    где имя_директории - полное или относительное имя директории, которую вы хотите сделать текущей. Команда cd без параметров сделает текущей директорией вашу домашнюю директорию.

    Просмотреть содержимое текущей или любой другой директории можно, воспользовавшись командой ls (от list). Если ввести ее без параметров, эта команда распечатает вам список файлов, находящихся в текущей директории. Если же в качестве параметра задать полное или относительное имя директории:

    ls имя_директории,

    она распечатает список файлов в указанной директории. Надо отметить, что в полученный список не войдут файлы, имена которых начинаются с символа "точка" - '.'. Такие файлы обычно создаются различными системными программами для своих целей (например, для настройки их работы). Посмотреть полный список файлов можно, дополнительно указав команде ls опцию -a, т.е. набрав ее в виде

    ls -a
    или

    ls -a имя_директории.

    У команды ls существует и много других опций, часть из которых мы рассмотрим на семинарах позже. Для получения полной информации о команде ls воспользуйтесь утилитой man.

  11. Путешествие по директорной структуре.

    Пользуясь командами cd, ls и pwd попутешествуйте по директорной структуре вашей операционной системы и порассматривайте ее содержимое. Возможно, зайти в некоторые директории или посмотреть их содержимое вам не удастся. Это связано с работой механизма защиты файлов и директорий, о котором мы поговорим немного позже. Не забудьте в конце путешествия вернуться в вашу домашнюю директорию.
     

  12. Команда cat и создание файла. Перенаправление ввода и вывода.

    Мы умеем перемещаться по логической структуре файловой системы и рассматривать ее содержимое. Хотелось бы уметь еще и просматривать содержимое файлов, и создавать их. Для просмотра содержимого небольшого текстового файла на экране можно воспользоваться командой cat. Если набрать ее в виде

    cat имя_файла,

    то на экран выплеснется все его содержимое. Nota bene Внимание! Не пытайтесь рассматривать на экране содержимое директорий - все равно не получится! Не пытайтесь просматривать содержимое неизвестных файлов, особенно если вы не знаете, текстовый он или бинарный. Вывод на экран бинарного файла может привести к непредсказуемому поведению вашего терминала. Если даже ваш файл и текстовый, но большой, то все равно вы увидите только его последнюю страницу. Большой текстовый файл удобнее рассматривать с помощью утилиты 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 для вашего командного интерпретатора.

  13. Создание файла с помощью команды cat.

    Убедитесь, что вы находитесь в своей домашней директории, и создайте с помощью команды cat новый текстовый файл. Просмотрите его содержимое.
     

  14. Простейшие команды работы с файлами - cp, rm, mkdir, mv.

    Для нормальной работы с файлами необходимо не только уметь создавать файлы, просматривать их содержимое и перемещаться по логическому дереву файловой системы. Нам нужно уметь создавать свои собственные поддиректории, копировать и удалять файлы, переименовывать их. Это минимальный набор операций, без которого нельзя чувствовать себя комфортно.

    Для создания новой поддиректории используется команда mkdir (сокращение от make directory). В простейшем виде команда выглядит следующим образом:

    mkdir имя_директории,


    где имя_директории - полное или относительное имя создаваемой директории. У команды mkdir имеется набор опций, описание которых можно посмотреть с помощью утилиты man.

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

    Для удаления файлов или директорий применяется команда 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.

    Nota bene Командой удаления файлов и директорий следует пользоваться с осторожностью. Удаленную информацию восстановить невозможно. Если вы системный администратор и ваша текущая директория - это корневая директория, пожалуйста, не выполняйте команду "rm -r *"!

    Для переименования файла или его перемещения в другой каталог применяется команда mv (сокращение от move). Для задания имен перемещаемых файлов в ней тоже можно использовать их шаблоны.
     

  15. История редактирования файлов - ed, sed, vi.

    Полученные знания уже позволяют нам достаточно свободно оперировать с файлами. Но что нам делать, если потребуется изменить содержимое файла, отредактировать его?

    Когда появились ранние варианты операционной системы UNIX устройства ввода и отображения информации существенно отличались от существующих сегодня. На клавиатурах присутствовали только алфавитно-цифровые клавиши (не было даже клавиш курсоров), а существовавшие дисплеи делали невозможными экранное редактирование. Поэтому первый редактор операционной системы UNIX - редактор ed требовал от пользователя строгого указания того, что и как мы будем редактировать с помощью специальных команд. Так, например, для замены первого сочетания символов "ra" на "ru" в одиннадцатой строке редактируемого файла мы должны были бы набрать команду

    11 s/ra/ru


    Редактор ed , по-существу, являлся построчечным редактором. Впоследствии появился экранный редактор - vi, однако и он требовал строгого указания того, что и как в текущей позиции на экране мы должны сделать, или каким образом изменить текущую позицию, с помощью специальных команд, соответствующих алфавитно-цифровым клавишам. Эти редакторы могут показаться вам сейчас странными убогими анахронизмами, но они до сих пор входят в состав всех вариантов UNIX и иногда (например, при работе с удаленной машиной по медленному каналу связи) являются единственным средством, позволяющим удаленно редактировать файл.
     

  16. Система Midnight Commander - mc. Встроенный mc редактор и редактор joe.

    Наверное, вы уже убедились в том, что работа в UNIX исключительно на уровне командного интерпретатора и встроенных редакторов далека от уже привычных для вас удобств. Но не все обстоит так плохо. Существует разнообразные пакеты, облегчающие жизнь пользователя в UNIX. К таким пакетам следует отнести Midnight Commander - аналог программ Norton Commander для DOS и FAR для Windows 9x и NT - со своим встроенным редактором, запускаемый командой mc, и экранный редактор joe. Информацию о них вы можете найти в UNIX Manual. Более удобно пользоваться многофункциональным текстовым редактором, например, emacs.
     
    Войдите в mc и попробуйте в нем походить по директориям, посоздавать и поредактировать файлы.

  17. Пользователь и группа. Команды chown и chgrp. Права доступа к файлу.

    Мы уже говорили ранее, что для входа в операционную систему UNIX каждый пользователь должен быть зарегистрирован в ней под определенным именем. Вычислительные системы не умеют оперировать именами, поэтому каждому имени пользователя в системе соответствует некоторое числовое значение - его идентификатор - UID (User IDentificator).

    Все пользователи в системе делятся на группы пользователей. Например, все студенты одной учебной группы могут составлять свою собственную группу пользователей. Группы пользователей также получают свои имена и соответствующие идентификационные номера - GID (Group IDentificator). В некоторых версиях UNIX каждый пользователь может входить ровно в одну группу, в некоторых - в несколько разных групп.

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

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

    • Пользователь, являющийся хозяином файла.

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

    • Все остальные пользователи.


    Для каждой из этих категорий пользователей хозяин файла может определить различные права доступа к файлу. Различают три вида прав доступа: право на чтение файла - r (от слова read), право на модификацию файла - w (от слова write) и право на исполнение файла - x (от слова execute). Для регулярных файлов смысл этих прав совпадает с указанным выше. Для директорий он несколько меняется. Право чтения для каталогов позволяет читать имена файлов, находящихся в этом каталоге (и только имена). Поскольку "исполнять" директорию бессмысленно (как, впрочем, и не исполняемый регулярный файл) право доступа на исполнение для директорий меняет смысл: наличие этого права позволяет получить дополнительную информацию о файлах, входящих в каталог: их размер, кто их хозяин, дата создания и т.д. Право на исполнение также требуется для директории, чтобы сделать ее текущей, а также для всех директорий по пути к указанной. Право записи для директории позволяет изменять ее содержимое: создавать и удалять в ней файлы, переименовывать их. Отметим, что для удаления файла достаточно иметь право записи для директории, в которую непосредственно входит данный файл, независимо от прав доступа к самому файлу.
     

  18. Команда ls с опциями -al. Использование команд chmod и umask.

    Посмотреть подробную информацию о файлах в некоторой директории, включая имена хозяина, группы хозяев и права доступа, можно с помощью уже известной нам команды ls с опциями -al. В выдаче этой команды третья колонка слева содержит имена пользователей хозяев файлов, а четвертая колонка слева - имена групп хозяев файла. Самая левая колонка содержит типы файлов и права доступа к ним. Тип файла определяет первый символ в наборе символов. Если это символ 'd' - то тип файла - директория, если там стоит символ '-', то это - регулярный файл. Следующие три символа определяют права доступа для хозяина файла, следующие три - для пользователей, входящих в группу хозяев файла, и последние три - для всех остальных пользователей. Наличие символа (r, w или x), соответствующего праву, для некоторой категории пользователей означает, что данная категория пользователей обладает этим правом.

    Вызовите команду ls -al для своей домашней директории и проанализируйте ее выдачу. Хозяин файла может изменять права доступа к нему, пользуясь командой chmod.

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

     

  19. Системные вызовы getuid и getgid.

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

  20. Компиляция программ на языке C в UNIX и запуск их на счет.

    Теперь мы практически созрели для того, чтобы написать первую программу в нашем курсе. Осталось только научиться компилировать программы на языке C и запускать их на счет. Nota bene Для компиляции программ в Linuх мы будем применять компилятор gcc. Для того, чтобы он нормально работал, необходимо, чтобы исходные файлы, содержащие текст программы, имели имена, заканчивающиеся на .c. В простейшем случае откомпилировать программу можно, запустив компилятор командой

    gcc имя_исходного_файла.


    Если программа была написана без ошибок, то компилятор создаст исполняемый файл с именем a.out. Изменить имя создаваемого исполняемого файла  можно, задав его с помощью опции -o :

    gcc имя_исходного_файла -o имя_исполняемого_файла.


    Компилятор gcc имеет несколько сотен возможных опций. Получить информацию о них вы можете в UNIX Manual.

    "Узнайте у своего системного администратора", как называется компилятор для вашей операционной системы и какие опции он имеет.

    Запустить программу на исполнение можно, набрав имя исполняемого файла и нажав клавишу <Enter>.

  21. Написание, компиляция и запуск программы c использованием системных вызовов getuid() и getgid().

    Напишите, откомпилируйте и запустите программу, которая печатала бы идентификатор пользователя, запустившего программу, и идентификатор его группы.
     

Программа курса | Следующий семинар