1.4. Сферы применения Java в современном информационном мире.

1.5. Версии Java машины и их эволюция.

1.6. Средства ООП, непосредственно поддерживаемые в Java.

1.7. Простейшие приложение на Java.

2. Алгоритмические средства языка Java. (1 час)

2.1. Строгая типизация Java.

2.2. Базовые типы языка. Строки и литералы.

2.3. Преобразования типов в выражениях.

2.4. Особенности инициализации массивов. Операторы управления памятью.

2.5. Краткий обзор операторов. Использование break.

3. Средства объектного программирования языка Java. (3 часа)

3.1. Представление объектов и классов.

3.1.1. Структура объявления класса.

3.1.2. Доступ к членам класса.

3.1.3. Спецификаторы доступа для обеспечения инкапсуляции.

3.1.4. Спецификатор доступа final.

3.1.5. Средства управления жизнью объекта. Конструкторы и метод finalize().

3.1.6. Принципы работы сборщика мусора.

3.1.7. Работа с массивами объектов.

3.1.8. Статические поля и методы классов. Классы – утилиты.

3.1.9. Блок статической инициализации.

3.1.10. Принцип работы ClassLoader.

3.2. Реализация отношений между объектами и классами.

3.2.1. Ассоциация и агрегация объектов и классов.

3.2.2. Использование и зависимость от интерфейсов.

3.2.3. Объекты при передаче параметров и возврате из методов.

3.2.4. Реализация отношения Клиент – Сервер.

3.2.5. Внутренние классы.

4. Средства объектно-ориентированного программирования Java. (6 часов)

4.1. Наследование в Java.

4.1.1. Производные классы.

4.1.2. Класс Object. Метод toString().

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

4.1.3. Управление доступом в производных классах.

4.1.4. Абстрактные классы и интерфейсы.

4.1.5. Реализация интерфейсов как альтернатива множественному наследованию.

4.1.6. Информация о типе на этапе исполнения. Оператор instanceof. Приведение типов.

4.1.7. Использование класса Class.

4.2. Пакеты.

4.2.1. Определение пакета.

4.2.2. Ограничение доступа.

4.2.3. Импортирование пакетов. Разрешение конфликтов имен.

4.3. Обработка исключений.

4.3.1. Основные принципы и типы исключительных ситуаций.

4.3.2. Перехват исключительных ситуаций. Операторы try, throw, throws, catch, finally.

4.3.3. Использование нескольких блоков catch и вложенный оператор try.

4.3.4. Не перехваченные исключительные ситуации.

4.3.5. Встроенные исключительные исключения Java. Классы Throwble и Exception.

4.3.6. Принципы создания и использования исключительных ситуаций.

4.4. Многопоточное программирование на Java. Параллелизм.

4.4.1. Модель потока в Java. Зависимость от реализации потока в операционной системе.

4.4.2. Свойства потока. Синхронизация. Передача сообщений.

4.4.3. Класс Thread и интерфейс Runnable.

4.4.4. Главный поток и способы создания потоков.

4.4.5. Управление потоками и приоритеты потоков.

4.4.6. Группы потоков.

4.4.7. Особенности написания многопоточных программ.

4.4.8. Использование синхронизирующих блоков и мониторов объектов. Синхронизированные методы объектов.

4.4.9. Взаимная блокировка.

4.4.10. Использование пула потоков.

5. Стандартная библиотека Java. (8 часов)

5.1. Организация пакетов стандартной библиотеки Java. Пакеты java и javax.

5.2. Обработка строк.

5.2.1. Использование и методы класса String

5.2.2. Использование StringBuffer.

5.3. Пакет java. lang.

5.3.1. Структура и назначение.

5.3.2. Использование класса System. Управление средой исполнения.

5.3.3. Использование классов Number, Double, Integer, Character и др.

5.3.4. Класс Math.

5.3.5. Класс Compiler и класс ClassLoader.

5.4. Пакет java. util

5.4.1. Общие принципы организации контейнеров и коллекций в Java.

5.4.2. Использование множеств и списков.

5.4.3. Использование отображений и ассоциативных контейнеров.

5.4.4. Итераторы и исключительные ситуации при работе с классами утилит.

5.4.5. Класс Properties.

5.4.6. Классы Date и Calendar.

5.5. Подсистема ввода вывода java. io

5.5.1. Общие концепции организации ввода – вывода в библиотеке Java.

5.5.2. Проблема платформенной независимости и локализации.

5.5.3. Основные классы потоков ввода-вывода в Java и методы работы с ними.

5.5.4. Использование потоков ввода вывода при работе с файлами. Эффективность.

5.5.5. Концепция Reader и Writer. Управление локализацией.

5.5.6. Использование Tokenizer.

5.6. Пакет .

5.6.1. Основы работы с сетью в Internet. Адресация.

5.6.2. Сокеты. Жизненный цикл сокета.

5.6.3. Работа с протоколом HTTP и класс URL.

6. Графическая подсистема Java. JFC. (4 часа)

6.1. Классы AWT.

6.1.1. Основы работы с окнами. Component, Container, Panel, Window, Frame, Canvas.

6.1.2. Доставка и обработка событий в графической подсистеме. Механизм Listeners.

6.1.3. Создание программы с оконным интерфейсом. Рисование графических примитивов.

6.1.4. Использование управляющих элементов, диспетчеров компоновки и меню.

6.1.5. Связь классов AWT с оконным интерфейсом операционной системы.

6.2. Классы Swing.

6.2.1. Основные принципы графической системы Swing. Платформенная независимость, понятие Look&Feel

6.2.2. Написание графического интерфейса с использованием Swing компонентов.

6.2.3. Работа с таблицами, текстом, диалогами и HTML.

6.3. Апплеты.

6.3.1. Основы работы с апплетом.

6.3.2. Жизненный цикл апплета.

6.3.3. Дескриптор APPLET.

6.3.4. Передача параметров и загрузка апплета.

7. Модель безопасности Java. (2 часа)

7.1. Принципы организации и эволюция модели безопасности в Java.

7.2. SecurityManager. Инициализация и функции.

7.3. Права доступа. Управление и проверка прав доступа.

7.4. Исключительные ситуации.

7.5. Java Cryptography Extension

7.6. Алгоритмы шифрования. Ключи и цифровые подписи.

8. Программирование распределенных приложений. (6 часов)

8.1. Принципы построения распределенных приложений.

8.2. Проблемы передачи объектов и синхронизации в распределенных приложениях.

8.3. Реализация сохраняемости.

8.4. Three-tier технология.

8.4.1. Уровень интерфейса.

8.4.2. Уровень бизнес логики.

8.4.3. Уровень сохранения.

8.5. Remote Method Invocation

8.5.1. Основные принципы и протокол взаимодействия.

8.5.2. Интерфейс Remote и класс UnicastRemoteObject.

8.5.3. Класс Naming и rmiregistry сервис.

8.5.4. RMI сервер.

8.5.5. RMI клиент.

8.5.6. Модель безопасности, синхронизация и сборка мусора в распределенных RMI приложениях.

8.5.7. Механизм Activation.

8.6. Основы Java Enterprise технологии.

8.6.1. Интеграция с Web.

8.6.2. Java сервлеты.

8.6.3. Java Server Pages. Web контейнеры.

8.6.4. Механизм SessionBeans.

8.6.5. EJB технология. Bean контейнеры.

8.7. JDBC технология.

8.8. Java Micro Edition.

8.8.1. Java для мобильных телефонов. K-virtual machine.

8.8.2. CLDC, MIDP и iMode расширения Java 2 ME.

8.8.3. Технология JavaCard.

8.8.4. Примеры реальных приложений. Сложность разработки.

8.9. Java media framework, технологии обработки звука и голоса.

9. Технология коллективной разработки Java приложений. (2 часа)

9.1. Использование документирующих комментариев.

9.2. Соглашения при написании кода и именовании классов и объектов.

9.3. Build система Ant. Автоматизация сборки и размещения Java приложений.

9.4. Система log4j.

10. Основы архитектурного анализа и проектирования объектно-ориентированных систем

10.1. Правила дизайна классов и пакетов.

10.2. Паттерны проектирования.

10.3. Цикл разработки объектно-ориентированного приложения. RUP.

(Возможна замена этой лекции на лекцию по C#)

Рылов

1. Тема: Описание классов и структура приложения в Java.

Продолжительность: 1 занятие.

Практические задания: Напишите простой класс контейнер для хранения произвольных объектов Object, с обеспечением минимального набора операций.

2. Тема: Иерархии классов и объектов.

Продолжительность: 3 занятия.

Практические задания: Перенесите программу из задания №8 по C++ на язык Java.

3. Тема: Знакомство с механизмом загрузки и инициализации объектов.

Продолжительность: 2 занятия.

Практические задания: Напишите программу, реализующую механизм фабрики объектов классов реализующих определенный интерфейс. Для реализации данного механизма следует воспользоваться механизмом Properties, классом Class, для определения класса создаваемого объекта, его загрузки в память JVM и инстанцирования с помощью конструктора по умолчанию.

4. Тема: Многопоточное программирование.

Продолжительность: 2 занятия.

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

5. Тема: Графическая подсистема Java.

Продолжительность: 2 занятия.

Практические задания: Напишите простейший текстовый редактор с поддержкой загрузки и сохранения файлов.

6. Тема: Апплеты.

Продолжительность: 1 занятие.

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

7. Тема: Модель безопасности Java.

Продолжительность: 1 занятие.

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

8. Тема: Распределенное программирование.

Продолжительность: 2 занятия.

Практические задания: Модифицируйте программу из задания №4 так, чтобы разные потоки завода по сборке машин работали в разных JVM.

9. Тема: Java Enterprise технология.

Продолжительность: 2 занятия.

Практические задания: С помощью JSP/EJB технологии реализуйте счетчик посещений сайта.

1. Объектно-ориентированное программирование, анализ и дизайн. Учебное пособие. / , Рылов : ИМ СО РАН, 2002

2. Объектно ориентированный анализ и проектирование с примерами приложений на С++, 2-е изд./Буч Гр. Пер. с англ. – СПб.; М.: «Невский Диалект» – «Издательство БИНОМ», 1999.

3. Принципы объектно-ориентированной разработки программ. 2-е изд. /Элиенс Антон. Пер с англ. – М.: Издательский дом «Вильямс», 2002

4. Язык UML. Руководство пользователя/ : Пер. с англ. – М. ДМК, 2000.

5. Язык программирования C++, 3-е изд./ Пер. с англ. – СПб.; М.: «Невский Диалект» – «Издательство БИНОМ», 1999 г.

6. Дизайн и эволюция языка С++. / Пер. с англ. – М. ДМК, 2000

7. Правила программирования C & C++ / Под редакцией – М.: Восточная книжная компания. 1996

8. Эффективное использование С+рекомендаций по улучшению ваших программ и проектов / Пер. с англ. – М. ДМК, 2000

9. Наиболее эффективное использование С+новых рекомендаций по улучшению ваших программ и проектов. / Пер. с англ. – М. ДМК, 2000

10. Философия Java / Эйкель Брюс – СПб.: Питер, 2001

11. Java 2. Наиболее полное руководство / – СПб.: BHV, 2001

Операционные системы

Иртегов

1. Классификация операционных систем. Понятие приложения реального времени.

2. Обзор архитектуры фон-неймановского процессора (на примере x86, SPARC). Режимы адресации: регистровый, литеральный, базовая, индексная и базово-индексная адресация, относительная адресация. Позиционно-независимый код. Ассемблер. Одно-, двух - и многопроходное ассемблирование. Таблица символов.

3. Загрузка программ. Абсолютный загрузчик. Относительный загрузчик. Сборка программ. Редактор связей. Архивные библиотеки. Разделяемые библиотеки. Позиционно-независимые разделяемые библиотеки ELF. Загрузка операционной системы. Первичный, вторичный и последующие загрузчики. Процесс загрузки Windows NT. Процесс загрузки SunSoft Solaris.

4. Управление памятью (открытая память). Статическое, динамическое и стековое распределение памяти. Внешняя и внутренняя фрагментация. Стратегии выделения памяти: первый подходящий, наиболее подходящий, наименее подходящий. Алгоритм парных меток. Алгоритм близнецов. Алгоритм GNU Malloc

5. Виртуальная память. Базовая адресация. Сегментная и страничная виртуальная память. Уровни привилегий. Виртуальная память VAX. Виртуальная память x86. Виртуальная память SPARC v9. Страничный обмен. Поиск жертвы. Алгоритм LRU. Clock-алгоритм. Приближения к clock-алгоритму. Стратегия управления памятью в VAX/VMS и Windows NT.

6. Внешние события. Опрос. Прерывания. Обзор многопроцессорных архитектур. Канальные процессоры. Симметричные многопроцессорные системы. NUMA-архитектуры.

7. Параллелизм с точки зрения программиста. Постановка задачи. Понятие критической секции. Реентерабельные процедуры. Взаимоисключение. Примитивы взаимоисключения. Спинлоки. Семафоры Дейкстры. Мертвая и живая блокировки. Обзор стратегий избежания блокировок. Понятие транзакции. Мониторные процессы. Гармонически взаимодействующие процессы.

8. Реализация параллелизма на однопроцессорном компьютере. Кооперативная многозадачность (сопрограммы). Вытесняющая многозадачность. Контекст процесса. Планировщик с приоритетами. Кооперативная и вытесняющая многозадачность внутри ядра (монолитное ядро и микроядро). Управляемая событиями архитектура.

9. Подсистема ввода-вывода. Драйверы внешних устройств. Архитектура драйвера. Многоуровневые драйверы. Синхронный и асинхронный ввод/вывод. Опережающее чтение и отложенная запись. Дисковый кэш. Дисковая подсистема. RAID.

10. Файловые системы. Понятия файла и каталога. Операции над файлами. Простые файловые системы (tar, RT-11). Сложные файловые системы (UFS, NTFS, HPFS). Жесткие и символические связи. Устойчивость файловой системы к сбоям. Восстановление файловых систем. Журнальные файловые системы.

11. Вопросы безопасности. Аутентификация и авторизация. Аутентификация паролем. Обзор биометрических методов аутентификации. Криптографическая аутентификация. Полномочия. Setuid и другие механизмы смены идентичности. Списки управления доступом. Вырожденные списки управления доступом (кольца защиты). Троянские программы и защита от них.

1. Ассемблеры и загрузчики. — М.: Мир, 1974.

2. Дисциплина программирования. — М.: Мир, 1978.

3. Введение в операционные системы. — М.: Мир, 1987.

4. Проектирование операционных систем для малых ЭВМ. — М.: Мир, 1986.

5. Введение в операционные системы – Спб: БХВ-Санкт-Петербург, 2002

6. Unix — универсальная среда программирования. — М.: Финансы и статистика, 1992.

7. Кнут программирования. — Издательский дом Вильямс, 2000.

8. Краковяк С. Основы организации и функционирования ОС ЭВМ. — М.: Мир, 1988.

9. Операционная система Unix. — СПб.: БХВ — Санкт–Петербург, 1999.

10. Современные операционные системы – М: Вильямс, 2001

11. Системное программирование в UNIX. — М.: ДМК Пресс, 2000.

12. Взаимодействующие последовательные процессы. — М.: "Мир", 1989.

Операционные системы Unix
(3 курс, 5 сем., 108 ч., диф. зачёт)

Иртегов

Раздел 1

1. Обзор среды программирования Unix. Использование компилятора gcc. Использование man. Другие источники информации

2. Среда исполнения программ. Адресное пространство процесса, пользовательская область. Доступ к параметрам процесса. Механизм Setuid.

3. Управление памятью.

4. Работа с файлами. Открытие и создание файла. Чтение и запись. Перемещение указателя чтения-записи. Отображение файлов в оперативную память. Другие операции.

5. Блокировка участков файлов. Блокировка на чтение и на запись. Рекомендательная и обязательная блокировка. Библиотечные функции для работы с блокировками.

6. Создание процессов и исполнение программ. Создание процессов системным вызовом fork. Системные вызовы семейства exec. Завершение процесса.

7. Управление процессами. Связь родитель-потомок. Код возврата процесса. Зомби. Системные вызовы семейства wait.

8. Терминальный ввод-вывод. Параметры терминального интерфейса. Канонический и неканонический режим ввода. Управление заданиями.

9. Управление файлами. Проверка доступа к файлу. Получение информации о файле. Жесткие и символические связи

10. Управление каталогами. Создание и уничтожение каталогов. Перемещение по дереву каталогов. Просмотр каталога.

Раздел 2

11. Сигналы. Понятие сигнала, типы сигналов. Реакция на сигнал по умолчанию. Обработка сигнала. Отправка сигнала процессам и группам процессов. Взаимодействие сигналов и операций ввода-вывода.

12. Трубы (программные каналы). Неименованные трубы. Создание труб. Взаимодействие процессов через неименованную трубу. Именованные трубы. Создание именованной трубы. Открытие именованной трубы.

13. System V IPC. Создание и уничтожение средств IPC. Управление средствами IPC.

14. IPC: очереди сообщений. Установка сообщения в очередь. Выбор сообщений из очереди. Ограничения при работе с очередями.

15. IPC: семафоры. Инициализация набора семафоров. Операции над набором семафоров. Группы операций.

16. IPC: разделяемая память. Подключение сегмента разделяемой памяти. Отключение сегмента разделяемой памяти. Использование семафоров для синхронизации доступа к разделяемой памяти.

Иртегов

Оценка на дифференцированном зачете выставляется по итогам практических занятий.

· Для получения оценки «отлично» на дифференцированном зачете следует сдать 23 задания практикума «Системное программирование» (не менее 10 заданий должно быть из раздела 2). Можно также получить оценку «отлично», сдав все задания, помеченные как «задания по shell».

· Для получения оценки «хорошо» на дифференцированном зачете следует сдать 11 заданий

· Для получения оценки «удовлетворительно» на дифференцированном зачете следует сдать 6 заданий. Студент, не сдавший ни одного задания, может получить оценку «удовлетворительно» по итогам устного собеседования по теме практикума.

· При сдаче всех заданий необходимо предоставить исходные тексты программы и продемонстрировать ее работу в операционной системе Solaris 8. Преподаватель обязан убедиться, что студент понимает принцип работы программы и способен контролировать последствия вносимых в программу изменений. Для этого преподаватель имеет право предъявить к сдаваемой программе дополнительные требования.

Раздел 1

1. Вывод различных атрибутов процесса в соответствии с указанными опциями

0 Напишите программу, которая будет обрабатывать опции, приведенные ниже. Опции должны быть обработаны в соответствии с порядком своего появления справа налево. Одной и той же опции разрешено появляться несколько раз. Используйте getopt(3C) для определения имеющихся опций. Сначала пусть ваша программа обрабатывает только некоторые опции. Затем добавьте еще, до тех пор, пока все требуемые опции не будут обрабатываться. Вы можете скопировать воспользоваться программой getopt_ex. c и изменить ее.

· -i Печатает реальные и эффективные идентификаторы пользователя и группы.

· -s Процесс становится лидером группы. Подсказка: смотриии setpgid(2).

· -p Печатает иидентификаторы процесса, процесса-родителя и группы процессов.

· -u Печатает значение ulimit

· -Unew_ulimit Изменяет значение ulimit. Подсказка: смотри atol(3C) на странице руководства strtol(3C)

· -c Печатает размер в байтах core-файла, который может быть создан.

· -Csize Изменяет размер core-файла

· -d Печатает текущую рабочую директорию

· -v Распечатывает переменные среды и их значения

· -Vname=value Вносит новую переменную в среду или изменяет значение существующей переменной.

Проверьте вашу программу на различных списках аргументов, в том числе:

· Нет аргументов

· Недопустимую опцию.

· Опции, разделенные знаком минус.

· Неудачное значение для U.

2. Время в Калифорнии

Измените программу ex_time. c, чтобы она выводила дату и время в Калифорнии (Pacific Standard Time, PST). Подсказка: Если время UTC 20 часов, то в Калифорнии 12 часов.

3. Установка идентификатора пользователя для доступа к файлу

Создайте файл данных, который может писать и читать только владелец (это можно сделать командой shell chmod 600 file) и напишите программу, которая

1. Печатает реальный и эффективный идентификаторы пользователя.

2. Открывает файл с помощью fopen(3). Если fopen() завершился успешно, файл должен быть закрыт с помощью fclose(3). Напечатайте сообщение об ошибке, используя perror(3C), если файл не удалось открыть.

3. Сделайте, чтобы реальный и эффективный идентификаторы пользователя совпадали. Подсказка: setuid(2)

4. Повторите перввые два шага.

Проверьте работу вашей программы.

1. Исполните программу и посмотрите вывод

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

3. Командой chmod u+s prog установите бит установки идентификатора пользователя и пусть ваши одногруппники опять исполнят эту программу.

4. Список строк

Напишите программу, которая вставляет строки, введенные с клавиатуры, в список. Память под узлы списка выделяйте динамически с использованием malloc(3). Ввод завершается, когда в начале строки вводится точка (.). Затем все строки из списка выводятся на экран.
Подсказка: Объявите массив символов размера, достаточного чтобы вместить самую длинную введенную строку. Используйте gets(3), чтобы прочитать строку, и strlen(3), чтобы определить ее длину. Помните, что strlen(3) не считает нулевой символ, завершающий строку. После определения длины строки, выделите блок памяти нужного размера и внесите новый указатель в список.

5. Таблица поиска строк в текстовом файле.

Написать программу, которая анализирует текстовый файл, созданный текстовым редактором, таким как ed(1) или vi(1). После запроса, который предлагает ввести номер строки, с использованием printf(3) программа печатает соответствующую строку текста. Ввод нулевого номера завершает работу программы. Используйте open(2), read(2), lseek(2) и close(2) для ввода/вывода. Постройте таблицу отступов в файле и длин строк для каждой строки файла. Как только эта таблица построена, позиционируйтесь на начало заданной строки и прочтите точную длину строки. Предполагайте, что файл не длиннее сотни строк.
Подсказка: Выберите или создайте текстовый файл с короткими строками. Помните, что первая строка начинается с нулевого отступа в файле. Найдите каждый символ перевода строки, запишите его позицию; в программе следует использовать вызов lseek(fd, 0L, 1). Для отладки распечатайте эту таблицу и сравните с таблицей, полученной вручную. Как только таблицы начнут совпадать, можно приступать к запросу номера строки.

6. Таблица поиска строк в текстовом файле.

Измените программу так, чтобы пользователю отводилось 5 секунд на ввод номера строки. Если пользователь не успевает, программа должна распечатать все содержимое файла и завершиться. Если же пользователь успел в течение пяти секунд ввести номер строки, то программа должна работать как в предыдущей задаче.

7. Таблица поиска строк в текстовом файле 2.

Измените предыдущую программу так, чтобы использовалось отображение файла в память взамен использования read(2), lseek(2) и write(2).

8. Защищенный текстовый редактор

Напишите программу, которая захватывает весь файл перед вызовом редактора. Это защитит файл с правами доступа группы на изменение. После того как программа захватит файл, вызовите свой любимый редактор с помощью библиотечной функции system(3). Попытайтесь в вашей программе использовать допустимое захватывание. Когда ваша программа захватит файл, попросите одногруппника исполнить вашу программу. Объясните результат. Потом попытайтесь использовать обязательное захватывание. Объясните результат.

9. Создание двух процессов

Напишите программу, которая создает подпроцесс. Этот подпроцесс должен исполнить cat(1) длинного файла. Родитель должен вызвать printf(3) и распечатать какой-либо текст. После выполнения первой части задания модифицируйте программу так, чтобы последняя строка, распечатанная родителем, выводилась после завершения порожденного процесса. Используйте wait(2), waitid(2) или waitpid(3).

10. Код завершения команды

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

11. Функция execvpe()

Напишите функцию execvpe(), которая работает как execvp(2), но позволяет изменять среду исполнения, как execve(2).
Совет: используйте внешнюю переменную environ

12. Командный интерпретатор shell (задание №1 по shell)

В этом упражнении вы должны разработать упрощенную версию командного интерпретатора системы UNIX - shell. В дальнейшем этот shell будет улучшен добавлением программных каналов и обработки сигналов. Для вас заранее написаны некоторые функции этой программы. В файле shell. c содержится скелет функции main() с комментариями, говорящими, где следует вставить ваш код. Функция main() вызывает функцию prompline() из файла promptline. c, которая читает строку из стандартного ввода. Затем main() вызывает parseline() из файла parseline. c, которая проверяет ввод на отсутствие синтаксических ошибок. Для каждой команды в строке, parseline() формирует дескриптор команды типа struct command, определенного в shell. h Существует глобальный массив таких структур, называемый cmds[] и объявленный в shell. c. Дескриптор команды состоит из двух полей. Первое поле - массив указателей, называемый cmdargs[]. Функция parseline() инициализирует этот массив указателями на строки - аргументы. Каждый аргумент завершается нулевым байтом. Во входной строке аргументы разделяются пробелами. Кроме того, parseline() помещает после последнего аргумента в списке cmdargs[] нулевой указатель. Команды могут разделяться переводом строки, точкой с запятой, амперсендом (&) или символами <, >, >> или |. Другие глобальные переменные, объявленные в shell. c определяют, должна ли команда быть запущена в основном (foreground) или фоновом (background) режиме, а также для перенаправления ввода/вывода из/в файл. Эти переменные (bkgrnd, infile, outfile и appfile) устанавливаются в функции parseline(). Если bkgrnd ненулевой, команда должна быть запущена в фоновом режиме, то есть ваш shell не должен ожидать завершения соответствующего процесса. Если infile ненулевой, он указывает на имя файла, из которого должен быть получен стандартный ввод первой команды в строке, т. е. символ <. Аналогично, если outfile ненулевой, он указывает на имя файла, куда следует перенаправить вывод последней команды в строке, т. е. символ >. Наконец, если appfile ненулевой, это имя файла, к содержимому которого следует добавить вывод последней команды в строке, т. е. символ >>. В следующих упражнениях вы будете модифицировать shell. c. Каждое последующее упражнение является улучшением предыдущего. Вы должны использовать следующую версию вызова exec(2):
execvp(cmds[i].cmdargs[0], cmds[i].cmdargs);

13. Исполнение команд (задание 2 по shell)

Модифицируйте shell. c для исполнения каждой команды в массиве cmds[] как подпроцесса. Во время исполнения этого подпроцесса, ваша программа должна ждать его завершения. Если программа, заданная во входной строке, не может быть найдена, shell должен распечатать сообщение об ошибке и продолжить исполнение. Предполагается, что пользователь набирает только простые команды, т. е. только одна команда на строке, без метасимволов, перенаправления ввода/вывода, конвейеров и символа &.

14. Исполнение в фоновом режиме (задание №3 по shell)

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

15. Перенаправление ввода/вывода (задание №4 по shell)

Измените вашу программу так, чтобы позволить перенаправление ввода/вывода. Заметьте, что перенаправление ввода ("< filename") используется только с первой командой в строке, а вывода ("> filename" или ">> filename") - только с последней.
Совет: используйте dup(2).

16. Ответ без ввода новой строки

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

17. Строчный редактор

Многие программы, принимающие ввод с терминала, позволяют редактировать строку перед использованием. Напишите программу, которая выключает эхо и каноническую обработку, таким образом выключив и обработку символа забоя. Ваша программа должна получать ввод с клавиатуры и показывать его на терминале в соответствии со следующими правилами:

a. Каждый введенный символ должен немедленно появляться на дисплее.

b. Когда вводится символ ERASE, стирается последний символ в текущей строке.

c. Когда вводится символ KILL, стираются все символы в текущей строке.

d. Когда вводится CTRL-W, стирается последнее слово в текущей строке, вместе со всеми следующими за ним пробелами.

e. Программа завершается, когда введен CTRL-D и курсор находится в начале строки.

f. Все непечатаемые символы, кроме перечисленных выше, должны издавать звуковой сигнал, выводя на терминал символ CTRL-G.

g. Длина строки ограничена 40 символами. Если какое-то слово пересекает 40-й столбец, это слово должно быть помещено в начало следующей строки.

18. Листинг каталога

Напишите программу - аналог команды ls - ld. Для каждого своего аргумента эта команда должна распечатывать:

· Биты состояния файла в воспринимаемой человеком форме:

o d если файл является каталогом

o - если файл является обычным файлом

o ? во всех остальных случаях

· Три группы символов, соответствующие правам доступа для хозяина, группы и всех остальных:

o r если файл доступен для чтения, иначе -

o w если файл доступен для записи, иначе -

o x если файл доступен для исполнения, иначе -

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