6.3. Внутренние переменные и способы изменения их значений.

6.4. Внешние переменные C-shell.

6.5. Работа с переменными окружения в C-shell.

Лабораторная работа N6

Изучение системы программирования на языке СИ в ОС UNIX

1.  Цель работы

Изучение работы с компилятором с языка СИ, создание архивных файлов и их использование в процессе сборки (редактирования связей) программ.

Использование команды cb для оформления С-программ. Изучение редактора связей ld. Использование интерпретатора make для автоматической сборки программы.

2. Основные положения

Для разрешения внешних ссылок ипользуется редактор связей. С этой целью он просматривает все указанные в командной строке файлы и стандартные библиотеки. Везде, где ld встречает внешние имена он пытается их связать. Результирующий модуль формируется, например, такой командой: ld fD. o fE. o libf. a

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

Некоторые комманды работы с объектными файлами.

НЕ нашли? Не то? Что вы ищете?

size - печать размера объектного файла.

strip - команда удаления таблиц перемещенний и имен из объектного файла.

nm - печать таблицы имен объектного файла.

od - форматированный просмотр объектного файла.

3. Порядок выполнения работы

3.1. Создание и автономная отладка объектного модуля по

заданному варианту.

3.2. Разработка make-программы для комплексной сборки и получения загрузочного модуля.

3.3. Исследование размеров и содержимого obj-файлов при помощи команд size и od до и после использования команды strip.

Технология выполнения работы:

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

4. Варианты заданий

Бригада 1 (4 чел.)

1. Считывание записей из файла в массив (как минимум два поля - цифровое и символьное).

2. Сортировка массива по любому полю.

3. Последовательный поиск в массиве.

4. Бинарный поиск в массиве.

5. Добавление нового элемента в отсортированный массив.

6. Вывод массива в файл и/или на экран.

Бригада 2 (4 чел., advanced)

1. Считывание квадратной матрицы любого размера из файла в двумерный массив.

2. Транспонирование матрицы.

3. Получение обратной матрицы.

4. Вычисление определителя матрицы.

5. Вывод матрицы на экран и в файл.

Бригада 3 (4 чел., advanced)

1. Сжатие файла методом замены повторяющихся символов парой <счетчик, символ>.

2. Распаковка файла, сжатого вышеприведенным методом.

3. Подсчет частоты появления для всех символов в файле.

4. Оценка степени сжатия файла кодированием Хаффмэна с использованием полученной в пункте 3 статистики (построить дерево и найти оптимальный код переменной длины, а затем вычислить среднюю длину кода).

5. Выдача кодов переменной длины в текстовой форме на экран и в файл.

Бригада 4 (4 чел., advanced)

1. Чтение абзаца из файла в буфер и установка длины строки.

2. Переформатирование абзаца.

3. Выравнивание абзаца по правому краю.

4. Отмена выравнивания абзаца.

5. Поиск и замена в абзаце заданного выражения.

Прим.: не забудьте визуализировать результат в пунктах 2, 3, 4 и 5.

Бригада 5 (3 чел.)

1. Инициализация очереди FIFO из файла.

2. Добавление элемента в очередь.

3. Удаление элемента из очереди.

4. Обращение очереди (первый <-> последний и т. д.)

5. Вывод очереди на экран и в файл.

4.1. Разное

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

5. Содержание отчета

Краткое описание назначения каждой исследуемой команды работы с системой СИ в ОС UNIX. Исходный текст программы и данные о размерах загружаемого модуля и всех его частей до и после использования команды strip. Текст mаkе-программы.

6. Конторльные вопросы

6.1. Назначение команд lint и cb.

6.2. Назначение команд ar и ranlib.

6.3. Система СИ и ее основные компоненты.

6.4. Редактор связей ld и его ключи.

6.5. Назначение команд size, strip, nm и od.

6.6. Обобщенная структура объектного модуля.

Лабораторная работа N7

Интерфейс прикладного программирования ОС UNIX:

Порождение новых процессов и запуск программ

1. Цель работы

Изучение программного интерфейса процессов, потоков выполнения (threads), атрибутов процесса, различных способов запуска программ.

2. Основные положения

Любая выполняющаяся программа в ОС UNIX является процессом или потоком выполнения. Все процессы, кроме самого первого (init, PID=1) порождаются "отпочковыванием" от родительского процесса в результате вызова им функции fork(). После вызова fork() родительский и порожденный процессы имеют одинаковые сегменты кода и данных, поэтому, чтобы начать выполнение новой программы, порожденный процесс должен выполнить вызов exec().

В рамках одного процесса могут выполняться несколько потоков (thread), в этом случае у них одинаковые атрибуты, за исключением идентификатора (PID) и адреса сегмента стека. Потоки выполнения порождаются специальными системными вызовами, например, pthread_create() или clone() в ОС Linux.

К атрибутам процесса относятся его номер (PID), принадлежность (UID, GID), программная группа (PGID), сеанс (SID), управляющий терминал, приоритет выполнения, текущее состояние, выполняемый файл, адресное пространство, открытые файлы, сигнальная маска, файловые блокировки, переменные среды, маска создания файлов и текущий каталог.

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

Номер процесса, его владельца и группу можно получить с помощью вызовов getpid(), getuid() и getgid() соответственно. Суперпользователь может изменить свой идентификатор и группу вызовами setuid() и setgid().

Сеанс и программная группа позволяют системе и пользователю манипулировать сразу несколькими процессами. Сеанс состоит из одной или нескольких программных групп. Когда пользователь входит в систему, порождается новый сеанс. Получить/изменить номер своего сеанса и программной группы процесс может вызовами getsid()/setsid() и getpgid()/setpgid().

Понятие сеанса и программной группы тесно связано с управляющим терминалом. Терминал, с которого пользователь входит в систему, становится управляющим для соответствующего сеанса. Управляющий терминал наследуется всеми потомками лидера сеанса и по умолчанию связан с их потоками ввода/вывода. Процесс может получать сигналы со своего управляющего терминала. Управляющий терминал обычно принадлежит одной из программных групп сеанса. По своему отношению к управляющему терминалу процессы (точнее, программные группы) делятся на фоновые и интерактивные. Выяснить принадлежность терминала позволяет системный вызов tcgetpgrp(), сменить владельца терминала - вызов tcsetpgrp(). Выяснить имя управляющего терминала позволяют функции isatty() и ttyname().

Маска прав доступа для создания новых файлов может быть получена и установлена вызовом umask().

Текущий каталог процесса может быть получен/изменен с помощью вызовов getcwd()/setcwd().

Приоритет выполнения процесса возвращают и изменяют вызовы getpriority() и setpriority().

3. Порядок выполнения работы

3.1.  Ознакомьтесь с синтаксом и особенностями работы перечисленных в предыдущем пункте системных вызовов API процессов.

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

Текст программы "forktest. c":

#include <stdio. h>

#include <unistd. h>

main()

{

int i;

if(fork())

for (i=0;i<10;i++) printf("I am a parent…\n");

else

for (i=0;i<10;i++) printf("I am a child!\n");

}

3.3.  Откомпилируйте и выполните вторую программу, результат выполнения с комментариями также поместите в отчет.

Текст программы "addrspace. c":

#include <stdio. h>

static int data1;

static unsigned long code, data, extend, stack;

main(int argc, char *argv[], char *envp[])

{

int data2;

printf("Addr of first env. var. : %08x\n", envp[0]);

printf("Addr of printf: %08x\n",printf);

printf("Addr of main : %08x\n",main);

printf("Addr of data1 : %08x\n",&data1);

printf("Addr of data2 : %08x\n",&data2);

printf("------------------------------------------\n");

asm ("movl %cs, code");

asm ("movl %ds, data");

asm ("movl %es, extend");

asm ("movl %ss, stack");

printf(" CS: %04x\n",code);

printf(" DS: %04x\n",data);

printf(" ES: %04x\n",extend);

printf(" SS: %04x\n",stack);

}

3.4. Напишите на языке Си функцию procinfo(), выводящую на экран в компактной форме следующую информацию о текущем процессе:

- идентификаторы: PID, PPID, UID, GID, SID, PGID

- управляющий терминал

- кол-во открытых файлов

- текущий каталог

- строку запуска программы

- текущий приоритет

- маску создания файлов

- карту виртуальной памяти процесса следующего вида:

Сегмент

Код

Данные

Стек

Среда

Начало

Xxxxx

Xxxxx

Xxxxx

Xxxxx

Конец

Xxxxx

Xxxxx

Xxxxx

Xxxxx

3.5.  Откомпилируйте функцию procinfo() в одноименную выполняемую программу.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5