Файл: Операционная система Linux предназначена для персональных компьютеров и рабочих станций.doc
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 11.01.2024
Просмотров: 107
Скачиваний: 8
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Вернемся к объектному коду. Эти самые "вкрапления" (самое главное среди них - таблица символов) позволяют объектному коду "пристыковываться" к другому объектному коду. Такой фокус делает компоновщик (линковщик) - программа, которая объединяет объектный код, полученный из "разных мест", удаляет все лишнее и создает полноценный бинарник. Этот процесс называется компоновкой или линковкой.
Итак, чтобы откомпилировать мультифайловую программу, надо сначала добыть объектный код из каждого исходного файла в отдельности. Каждый такой код будет представлять собой объектный модуль. Каждый объектный модуль записывается в отдельный объектный файл. Затем объектные модули надо скомпоновать в один бинарник.
В Linux в качестве линковщика используется программа ld, обладающая приличным арсеналом опций. К счастью gcc самостоятельно вызывает компоновщик с нужными опциями, избавляя нас от "ручной" линковки.
Попробуем теперь, вооружившись запасом знаний, написать мультифайловый Hello World. Создадим первый файл с именем main.c:
/* main.c */
int main (void)
{
print_hello ();
}
Теперь создадим еще один файл hello.c со следующим содержимым:
/* hello.c */
#include
void print_hello (void)
{
printf ("Hello World\n");
}
Здесь функция main() вызывает функцию print_hello(), находящуюся в другом файле. Функция print_hello() выводит на экран заветное приветствие. Теперь нужно получить два объектных файла. Опция -c компилятора gcc заставляет его отказаться от линковки после компиляции. Если не указывать опцию -o, то в имени объектного файла расширение .c будет заменено на .o (обычные объектные файлы имеют расширение .o):
$ gcc -c main.c
$ gcc -c hello.c
$ ls
hello.c hello.o main.c main.o
$
Итак, мы получили два объектных файла. Теперь их надо объединить в один бинарник:
$ gcc -o hello main.o hello.o
$ ls
hello* hello.c hello.o main.c main.o
$ ./hello
Hello World
$
Компилятор увидел, что вместо исходных файлов (с расширением .c) ему подбросили объектные файлы (с расширением .o) и отреагировал согласно ситуации: вызвал линковщик с нужными опциями.
Чтобы понять, что произошло, воспользуемся утилитой nm. Объектные файлы содержат таблицу символов. Утилита nm как раз позволяет посмотреть эту таблицу в читаемом виде. Те, кто пробовал программировать на ассемблере знают, что в исполняемом файле буквально все (функции, переменные) стоит на своей позиции: стоит только вставить или убрать из программы один байт, как программа тут же превратиться в груду мусора из-за смещенных позиций (адресов). У объектных файлов особая роль: они хранят в таблице символов имена некоторых позиций (глобально объявленных функций, например). В процессе линковки происходит стыковка имен и пересчет позиций, что позволяет нескольким объектным файлам объединиться в один бинарник. Если вызвать nm для файла hello.o, то увидим следующую картину:
$ nm hello.o
U printf
00000000 T print_hello
$
О смысловой нагрузке нулей и литер U,T мы будем говорить при изучении библиотек. Сейчас же важным является то, что в объектном файле сохранилась информация об использованных именах. Своя информация есть и в файле main.o:
$ nm main.o
00000000 T main
U print_hello
$
Таблицы символов объектных файлов содержат общее имя print_hello. В процессе линковки высчитываются и подставляются в нужные места адреса, соответствующие именам из таблицы. Вот и весь секрет.
$ gcc progr1
gcc: no input files
$
Настройка командного интерпретатора
с помощью специальных переменных
В ОС Linux есть специальные переменные интерпретатора, с помощью которых осуществляется настройка интерпретатора пользователя. Часть из них определяет система при регистрации пользователя, а остальные пользователь может определить сам, изменив установленные системой по умолчанию.
Автоматическое определение специальных переменных осуществляется специальными сценариями командного интерпретатора, которые называются файлами инициализации. При запуске КИ выполняются соответствующие файлы инициализации. При каждой регистрации пользователя в системе, включающей КИ BASH, выполняется файл инициализации .bash_profile командного интерпретатора BASH. В этом файле содержатся определения специальных переменных и значения для них. Их можно изменить, редактируя файл или выполняя специальные команды из КИ BASH. Редактировать файлы инициализации имеет право системный администратор, а изменить специальные пользовательские переменные может пользователь из командной строки. К таким переменным относятся: HOME, SHELL, PATH, PS1, PS2, MAIL.
HOME ‑ содержит путевое имя начального каталога пользователя;
SHELL ‑ содержит путевое имя программы для того типа интерпретатора, в котором регистрируется пользователь;
PATH ‑ содержит перечень каталогов, в которых выполняется поиск команд Linux;
PS1 ‑ содержит основные символы приглашения к работе, показываемые в командной строке;
PS2 ‑ содержит дополнительный символ приглашения, который используется для команд, состоящих из нескольких строк;
MAIL ‑ содержит путевое имя файла почтового ящика.
Значения указанных переменных можно просмотреть, набрав в командной строке:
$ echo $имя_переменной, например: $ echo $MAIL
Значения указанных переменных можно изменить, присвоив им новые значения. При этом можно использовать заранее определенный набор кодирующих символов: \w - показать текущий рабочий каталог, \u - показать имя пользователя, \t - показать время или \! - номер события в хронологическом списке, например:
$ PS1="ваш текст\u\w $",
$ PS1="\t\u ->",
$ PS2="@"
Команда сортировки sort
Команда sort предназначена для сортировки строк текстовых файлов по алфавиту. Для изучения команды sort выполнить:
Задание 1. 1. Войти в свой рабочий каталог (если Вы начали работу, то в нем окажетесь автоматически) и создать новый файл spisok, состоящий из 10 - 15 непронумерованных строк, т.е. имитирующий список каких-либо объектов, например фамилий.
Задание 2. Отсортировать список в алфавитном порядке и вывести на экран ( | - обозначение так называемого программного канала - передача выходных данных команды на вход следующей команды):
$ sort spisok | cat
что аналогично выполнению последовательности двух команд:
$ sort spisok
$ cat spisok
При этом содержимое файла spisok не изменяется, а на экране воспроизводится отсортированный файл.
Задание 3. Отсортировать файл в обратном порядке (опция -f или –r команды sort), пронумеровать строки и вывести на стандартное устройство вывода - экран (опция -n команды cat), результат записать в новый файл spisok1 (> - перенаправление стандартного вывода в файл или на устройство).
$ sort spisok | cat -n > spisok1
Задание 4. Вывести на экран содержимое файла spisok1 и записать в файл spisok2 с использованием перенаправления стандартного ввода-вывода, следующим образом:
$ cat < spisok1 > spisok2
Контрольное задание
Изучите элементы рабочего стола, который Вы увидели после входа в систему. Просмотрите файловую структуру ОС Linux в графическом режиме. Удобно войти в нее через ярлык home directory, расположенный на рабочем столе или запустить из главного меню программу Nautilus (рабочий стол GNOME) или Konquerror (рабочий стол KDE).
Просмотрите содержимое основных каталогов, доступных пользователю для чтения: bin, dev, etc, lib, mnt, tmp, var. Из каталога usr скопируйте 2 файла в Ваш рабочий каталог.
Запустите окно терминала и выполните команды определения путевого каталога, просмотра списка файлов и каталогов текущего каталога и выбранных Вами из файловой структуры. Используйте разные опции команды ls.
Используя текстовые редакторы vi, vim, gvim, gedit и команду cat, создайте по одному файлу в каждом из перечисленных текстовых редакторов, установленных в Вашей системе. Созданный в одном редакторе файл отредактируйте в другом (можно выбрать вариант: текстовый и графический редакторы).
Составьте файловую структуру, имеющую три уровня вложения и содержащую 5 - 6 созданных Вами файлов, расположив их в каталогах разных уровней. Выполните это задание в режиме консоли, в качестве примера используйте пример, представленный в конце работы. Cоздавая структуру, проверяйте результаты командой ls с различными опциями.
Используя справочник man, уточните опции и параметры нескольких описанных в работе команд. Выборочно проверьте некоторые из них.
Используя архив команд history_list, повторите несколько команд на выбор. Проверьте возможность редактирования этих команд.
Настройте командный интерпретатор с помощью специальных переменных по-другому, используя описанные выше кодирующие символы.
Изучите программу Midnight Commander. Ее запуск осуществляется из окна терминала: $ mc. Создайте подкаталог в Вашем рабочем каталоге и запишите в него 2 - 3 файла.
Выполните примеры и задания, представленные в работе.
Выполните следующие команды, используя свои файлы и каталоги (перемещения по каталогам отслеживать самостоятельно):
1. Сравнение двух файлов посимвольно: $ cmp f1 f2
где f1 и f2 - любые файлы текущего каталога. Команда cmp проверяет файлы до первого различия и выводит позицию отличающегося символа и строки второго файла.
2. Проверка: файл или директорий? $ file f1 k2
В результате выводится информация:
f1 : text
k2 : directory
3. Просмотр содержимое текущего каталога другим способом: $ ls -F
Результат выполнения команды: f1 k2/
4. Просмотр файла по байтам
$ od - опция
Возможные опции:
-с - в символьном формате
-d - в десятичном формате
-o - в шестнадцатеричном формате
-x - значения байтов в восьмеричном формате
5. Запись в файл и на стандартный вывод (терминал или экран):
$ tee file1
6. Использование различных опций в команде more, удобной для просмотра больших файлов. Просмотреть содержимое указанных файлов (без опций): $ more f1 f2 f3 f4, здесь f1, f2, f3, f4, - имена файлов.
Использование команды more с различными опциями:
Показать содержимое файла file1, начиная с четвертой страницы:
$ more +4 file1
Пропуск пяти страниц вперёд: $ more 5 file1
Пропуск двух страниц назад: $ more - 2 file1
Прокрутка содержимого файла по полстраницы: $ more d file1
Просмотр опций команды more: $ more h
q - выход из команды-утилиты more.
7. Копирование файла f1 в другой файл f5 с проверкой: существует ли уже файл f5?
$ cp -i f1 f5
Если файл f5 уже существует, то на экране появляется сообщение: overwrite f5? (перезаписать файл f5?) требуется ответить: n - если не перезаписывать; y - если перезаписывать вместо предыдущего файла f5.
8. Аналогично, опция i используется для команды перемещения и удаления:
$ mv -i f3 f4
(здесь будет выведено подтверждение на перемещение файлов f3 и f4)
9. $ rm -i f5 (будет выведено подтверждение на удаление файла f5).
10. Изучить команды head и tail, дающие возможность просмотреть первые или последние несколько строк файла (по умолчанию выводятся первые 10 строк файла), используя соответственно:
$ head имя_файла и $ tail имя_файла
Лабораторное задание
и порядок выполнения работы
Изучить материал, выполняя примеры и задания