Назад

Введение

Содержание


Компилятор языка С

Операционная система Unix и язык C - "близненцы-братья". Вспомните, что язык программирования C был создан (Д.Ритчи, 1972 г) специально для написания операционной системы Unix, и с тех пор и "каноническая" ОС Unix, и все ее клоны пишутся на языке C. Поэтому во всех версиях Unix и Unix-подобных систем компилятор языка C входит в комплект поставки системы.

Одним из первых программных продуктов, созданных в рамках проекта GNU, также явился компилятор языка С с открытым кодом. Этот компилятор включается в поставку всех версий ОС Linux.

Таким образом, среда, в которой выполняется наш лабораторный практикум предоставляет в Ваше распоряжение 4 компилятора на выбор: ccстандартный компилятор языка C; c++стандартный компилятор языка C++; gccGNU-компилятор языка C; g++GNU-компилятор языка C++.

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

Компилятор языка C выполняет как собственно компиляцию - перевод исходного текста на машинный язык, - результатом чего является объектный модуль, так и редактирование связей - сборку из нескольких объектных модулей (в том числе, и библиотечных) исполняемого модуля.

Файлы с исходными текстами C-программ должны иметь расширение .c, например: hello.c. Результатом компиляции является файл, содержащий объектный модуль, его имя совпадает с именем исходного модуля, а расширение - .o, например: hello.o. Для файла, содержащего исполняемый модуль стандартного расширения не существует. При компиляции программы, состоящей из единственного исходного модуля, объектный модуль автоматически удаляется после создания компилятором исполняемого модуля.

Общий формат команда вызова компилятора имеет следующий вид:

       cc [опции] [выходной_файл] файл1 [файл2 :]

Наиболее часто употребляемые опции компилятора следующие:

-c
  Подавляет фазу редактирования связей, создает объектный модуль для каждого исходного модуля из перечисленных в параметрах вызова. выходной_файл с этой опцией не задается. Опция может применяться вместе с опцией -I
-o
  Компиляция и редактирование связей. Файлы, создает объектный модуль для каждого исходного модуля из перечисленные в параметрах вызова и имеющие расширение .c, рассматриваются как исходные модули и компилируются; файлы, имеющие расширение .o, рассматриваются как объектные модули и подключаются при редактировании связей. Параметр выходной_файл задает имя файла исполняемого модуля. Опция может применяться вместе с опциями -L, -l, -I.
-Lкаталог
  Добавить каталог в список каталогов, которые содержат объектные библиотечные модули.
-lбиблиотека
  При редактировании связей подключить модули из библиотеки.
-lбиблиотека
  При редактировании связей подключить модули из библиотеки.
-Iкаталог
  Искать включаемые (#include) файлы, имена которых не начинаются с / сначала в каталоге, а лишь затем - в стандартных каталогов для включаемых файлов.
-E
  Выполнить обработку указанных исходных модулей только препроцессором, результат направляется в стандартный вывод. выходной_файл с этой опцией не задается. Опция может применяться вместе с опцией -I.
-w
  Подавить выдачу предупреждающих сообщений.

Примеры:

cc hello.c
  Компиляция исходного модуля hello.c с выдачей сообщений об ошибках на стандартный вывод. Файл объектного модуля не создается.
cc -c hello.c
  Компиляция исходного модуля hello.c с выдачей сообщений об ошибках на стандартный вывод. При успешной компиляции объектный модуль записывается в файл hello.o.
cc -o hello hello.o
  Редактирование связей для объектного модуля hello.o, исполняемый модуль записывается в файл hello.
cc -o hello hello.o hello1.c
  Создание исполняемого модуля в файле hello из объектного модуля hello.o и модуля hello1.c (последний модуль является исходным, он предварительно компилируется.
cc -o hello hello.o hello1.o -l hellolib
  Создание исполняемого модуля в файле hello из объектных модулей hello.o и hello1.o c с подключением объектных модулей из библиотеки hellolib.


Задания к лабораторным работам

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

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

Значительная часть программных кодов, созданных Вами в ходе выполнения каждой работы будет переноситься в следующие работы. Рекомендуем Вам оформлять такие фрагменты кода как включаемые файлы (.h-файлы).

По смыслу задач "деятельность" субъектов должна занимать некоторое время. Предполагается, что это время занято какой-то реальной деятельностью, а не ожиданием (даже если в программной модели результаты этой деятельности не рассматриваются). В терминах программирования это означает, что процесс, выполняющий эту "деятельность", занимает центральный процессор. Поэтому для моделирования такой "деятельности" нельзя применять системные вызовы типа sleep, nanosleep, так как они обеспечивают задержку процесса в состоянии ожидания, без использования центрального процессора. Для "занятого ожидания" нами созданы две функции:

Исходные тексты этих функций доступны для вас в каталоге /home/metod/ в файлах a0wait.c и a1wait.c.

В том же каталоге в файле curtime.c определена вспомогательная функция curtime, позволяющяя получить символьное представление текущего времени.


Описание примера

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

Легенда: Слоны на водопое

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

В нашей "легенде" стадо Слонов ищет воду в саванне. Условия поиска и потребления воды уточняются в каждой задаче отдельно. Каждый Слон представляется отдельным процессом или нитью. Процесс_монитор, представляющий "коллективный разум" слоновьего стада, (мы назвали его Ганеша) осуществляет общее управление стадом.

Каждый отдельный Слон характеризуется такими атрибутами, как:

Программное представление Слона описывается в файле elephant.h, который мы включаем в программы всех наших примеров.

Во всех примерах мы также работаем с одним и тем же стадом - массивом Слонов. Стадо определяется в файле herd.h, который мы также включаем во все примеры.


Назад