
- •Список сокращений
- •Введение
- •Маршрут разработки программ
- •Компилятор gnu gcc Toolchain
- •Компиляция одного файла
- •Компиляция нескольких файлов
- •Автоматизация сборки
- •Отладка программы
- •Принципы взаимодействия программ и ос
- •Системные вызовы
- •Библиотечные вызовы
- •Запуск и завершение процесса
- •Работа со строками
- •Системные вызовы для работы с файлами и потоками
- •Работа с файлами
- •Работа с потоками ввода-вывода
- •Библиотечные вызовы для работы с файлами и потоками
- •Работа с файлами
- •Работа с потоками ввода-вывода
- •Работа с директориями
- •Упражнения
- •Индивидуальные задания
- •Контрольные вопросы
- •Список литературы
Лабораторные работы по курсу
Операционные системы
Лабораторная работа 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 ]).
Маршрут разработки программ
Компилятор 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», называемые объектными). Однако данный код еще невозможно исполнять на процессоре ввиду отсутствия связи между отдельными функциями и переменными.
Для определения взаимосвязей используется этап компоновки. Он объединяет все необходимые инструкции между собой и создает взаимосвязи между ними внутри единого исполняемого файла.