Добавил:
github.com Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
9
Добавлен:
30.09.2023
Размер:
144.97 Кб
Скачать

Лабораторные работы по курсу

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

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

Основы разработки программ на языке C для ОС Linux

2022

Оглавление

Список сокращений 4

Введение 5

1. Маршрут разработки программ 5

1.1. Компилятор GNU GCC Toolchain 5

1.1.1. Компиляция одного файла 7

1.1.2. Компиляция нескольких файлов 7

1.2. Автоматизация сборки 8

1.3. Отладка программы 9

2. Принципы взаимодействия программ и ОС 10

2.1. Системные вызовы 10

2.2. Библиотечные вызовы 11

2.3. Запуск и завершение процесса 11

3. Работа со строками 12

4. Системные вызовы для работы с файлами и потоками 16

4.1. Работа с файлами 16

4.2. Работа с потоками ввода-вывода 19

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

5.1. Работа с файлами 20

5.2. Работа с потоками ввода-вывода 23

6. Работа с директориями 24

7. Упражнения 25

2. Индивидуальные задания 29

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

8. Список литературы 30

Список сокращений

ОС

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

POSIX

Portable Operating System Interface

GCC

GNU C Compiler

GDB

GNU Debugger

Введение

Язык программирования C [ CITATION ISO22 \l 1033 ], несмотря на свою многолетнюю историю, по сей день остается одним из актуальных инструментов разработчика. Особенно часто C применяется если требуется достичь максимальной производительности программ при минимальной затрате аппаратных ресурсов, что наиболее характерно для программных комплексов встраиваемых систем.

Первоначально язык C был разработан для создания ОС Unix [ CITATION Кер01 \l 1049 ], однако в последствии он был перенесен на множество других платформ и использован для создания других ОС. Например, исходные коды ОС Linux также изначально разрабатывались на C и до сих пор на 98,5% написаны именно на этом языке программирования [ CITATION htt22 \l 1033 ]. В связи с этим, помимо инструмента разработки, уже многие десятилетия C также является и инструментом описания, и демонстрации принципов взаимодействия прикладных программ, и ОС. Стандарт POSIX, регламентируя поведение ОС, содержит множество примеров на C [ CITATION IEE22 \l 1033 ], и в том числе компенсирует некоторые из его недостатков [ CITATION IEE18 \l 1033 ]. А понимание принципов взаимодействия прикладных программ с ОС Linux практически полностью опирается на многочисленные справочные описания, написанные с использованием C.

Целью данной лабораторной работы является освоение первичных навыков разработки прикладных программ на языке C для ОС Linux, используя интерфейс командной строки. Предполагается, что читатель уже знаком с основами языка и имеет базовый опыт разработки прикладных программ (описание языка C приведено в официальной и последней на текущей момент спецификации C17 [ CITATION ISO22 \l 1033 ]).

  1. Маршрут разработки программ

    1. Компилятор gnu gcc Toolchain

При создании программ на языке С в ОС Linux наиболее часто используется пакет GNU Toolchain [ CITATION Fre22 \l 1033 ], предназначенный для комплексной разработки и отладки приложений. Всего GNU Toolchain включает в себя:

  • GNU Compiler Collection (GCC) – набор компиляторов для множества языков программирования;

  • GNU Make – средство автоматизации для компиляции и сборки;

  • GNU Binutils – набор утилит, включающих компоновщик и транслятор;

  • GNU Debugger (GDB) – средство для отладки программ;

  • GNU Autotools – система сборки;

  • GNU Bison – генератор синтаксических анализаторов.

Процесс преобразования исходных кодов на языке C в исполняемый файл традиционно разделяется на четыре последовательных этапа [ CITATION Ахо20 \l 1049 ], показанных на Рисунке Рисунок 1:

Рисунок 1. Последовательность этапов компиляции

На вход компилятора подаются файлы с исходными кодами «*.c» и заголовочные файлы «*.h», результатом работы компилятора является исполняемый файл, который на Рисунке Рисунок 1 обозначен как prg.

Первым этапом является препроцессинг (предобработка) исходных кодов. Его работа связана с подстановкой текста вместо директив и макросов в исходные коды с-файлов. Например, все константы, заданные в программе директивой «#define», будут заменены при препроцессинге на значения этой константы в тексте программы, директивы «#include» будут заменены текстом указанного в директиве файла и т. д.

Этап компиляции представляет собой преобразования исходных кодов программы после препроцессинга (файлы «.i») в набор машинных инструкций на языке ассемблера (файлы «.s»). Конкретный набор используемых инструкций существенно зависит от архитектуры процессора, для которого производится компилирование. Нельзя скомпилировать исходные коды под одну архитектуру и использовать результаты компиляции на другой архитектуре.

Этап ассемблирования принимает на вход набор инструкций ассемблера (файлы «.s») и переводит его в машинный код – набор байт, которые определяют команды и операнды для процессора (файлы «.o», называемые объектными). Однако данный код еще невозможно исполнять на процессоре ввиду отсутствия связи между отдельными функциями и переменными.

Для определения взаимосвязей используется этап компоновки. Он объединяет все необходимые инструкции между собой и создает взаимосвязи между ними внутри единого исполняемого файла.

Соседние файлы в папке OS_labs