Metodicheskie ukazaniya UNIX 2014
.pdf2.2 Завдання до лабораторних робіт по темі «Програмування під
LINUX»
Завдання 1
Програма «Hello World»
Щоб відразу почати програмувати, створимо ще один клон відомої програми "Hello World". Що робить ця програма, ви знаєте. Відкриємо текстовий редактор і наберемо в ньому наступний текст:
/* Hello.c */ #include <stdio.h> int main (void)
{
printf ("Hello World \n");
}
Назвемо свій файл hello.c. Вміст файлу hello.c - це вихідний код програми, а hello.c - це вихідний файл програми.
Вихідний код написаний на мові програмування C.
Щоб відкомпілювати наш Hello World достатньо набрати в командному рядку наступне заклинання:
$ gcc -o hello hello.c
$
Якщо вихідний код написаний без синтаксичних помилок, то компілятор завершить свою роботу без будь-яких повідомлень.
Набравши команду ls побачимо новий файл з ім'ям hello. Цей файл містить виконуваний код програми (бінарник).
Опція -o компілятора gcc вказує на те, яким має бути ім'я вихідного файлу. Якщо не вказати опцію -o, то бінарники, в нашому випадку, буде присвоєно ім'я a.out.
Залишилося тільки запустити отриманий бінарник. Для цього набираємо в командному рядку таку команду:
$ ./hello Hello World
$
Завдання 2
Мультіфайловое програмування Якщо вихідний код скільки-небудь серйозної програми вмістити в
одному файлі, то такий код стане просто нечитабельним. До того ж, якщо
21
програма компілюється досить довго (особливо це відноситься до мови C++), то після виправлення однієї помилки, потрібно перекомпілювати весь код.
Куди краще розкидати вихідний код по декількох файлах (осмислено, з
якого-небудь критерію), і компілювати кожен такий файл |
окремо. |
Щоб відкомпілювати мультіфайлову програму, треба спочатку |
створити |
об'єктний код з кожного вихідного файлу окремо. Кожен такий код буде являти собою об'єктний модуль. Кожен об'єктний модуль записується в окремий об'єктний файл. Потім об'єктні модулі треба скомпонувати в один бінарник
В Linux як лінковщік використовується програма ld, що володіє пристойним арсеналом опцій. Gcc самостійно викликає компоновщик з потрібними опціями.
Напишемо мультіфайловий Hello World. Створимо перший файл з іменем main.c:
/* Main.c */ int main (void)
{
print_hello ();
}
Тепер створимо ще один файл hello.c з наступним змістом: /* Hello.c */
#include <stdio.h> void print_hello (void)
{
printf ("Hello World \ n");
}
Тепер потрібно отримати два об'єктних файлу. $ gcc -c main.c
$ gcc -c hello.c $ ls
hello.c hello.o main.c main.o
$
Отже, ми отримали два об'єктних файлу. Тепер їх треба об'єднати в один бінарник:
$ gcc -o hello main.o hello.o $ ls
hello * hello.c hello.o main.c main.o $ ./hello
Hello World
$
22
Завдання 3
Автоматичне прибирання В попередньому завданні для створення бінарники з двох вихідних
файлів нам довелося набрати три команди. Якби програму довелося налагоджувати, то кожен раз треба було б вводити одні і ті ж три команди.
Вихід із ситуації, що склалася є. Це утиліта make, яка працює зі своїми власними сценаріями. Сценарій записується у файлі з іменем Makefile і поміщається в репозиторій (робочий каталог) проекту.
Найголовніша перевага make - це "інтелектуальний" спосіб рекомпіляції: в процесі налагодження make компілює тільки змінені файли.
Те, що виконує утиліта make, називається складанням проекту, а сама утиліта make відноситься до розряду складальників.
Будь Makefile складається з трьох елементів: коментарі, макроозначення і цільові зв'язки (або просто зв'язки). В свою чергу зв'язки складаються теж з трьох елементів: мета, залежності і правила.
Сценарії make використовують однорядкові коментарі, що починаються з літери # (решітка).
Спробуємо скласти сценарій збірки для розглянутого в попередньому розділі мультіфайлового проекту Hello World. Створіть файл з ім'ям Makefile:
# Makefile for Hello World project hello: main.o hello.o
gcc -o hello main.o hello.o main.o: main.c
gcc -c main.c hello.o: hello.c gcc -c hello.c clean:
rm -f * .o hello
Зверніть увагу, що в кожному рядку перед викликом gcc, а також у рядку перед викликом rm стоять табуляції. Як ви вже здогадалися, ці рядки є правилами. Формат Makefile вимагає, щоб кожне правило починалося з табуляції. Тепер розглянемо все по порядку.
Тепер залишилося запустити сценарій. Формат запуску утиліти make
наступний: make [опції] [мети ...] $ make
gcc -c main.c gcc -c hello.c
gcc -o hello main.o hello.o $ ls
hello * hello.c hello.o main.c main.o Makefile $ ./hello
23
Hello World
$
Завдання 4
Модель КІС (Клієнт-Інтерфейс-Сервер)
Модель КІС - це елегантна концепція розподілу вихідного коду в репозиторії (робочий каталог, в якому знаходяться вихідні коди, сценарії збірки (Makefile) та інші файли, що відносяться до проекту), в рамках якої всі вихідні коди можна поділити на клієнти, інтерфейси і сервери.
Сервер надає послуги. це можуть бути функції, структури, перерахування, константи, глобальні змінні та інше. У мові C ++ це найчастіше класи або ієрархії класів.
Інтерфейс (протокол) - це умовний набір правил, згідно з якими взаємодіють клієнт і сервер.
Зазвичай для організації інтерфейсів використовуються оголошення (прототипи), які поміщаються найчастіше в заголовні файли. У мові C це файли з розширенням .h; в мові C ++ це файли з розширенням .h, .hpp або без розширення.
Включаючи в програму заголовний файл директивою #include, ми погоджуємося працювати з сервером (будь то бібліотека або простий об'єктний файл) за його протоколу
Тепер спробуємо застосувати модель КІС на практиці для нашого проекту Hello World. Створимо файл hello.h:
/* Hello.h */
void print_hello (void);
Тепер включимо цей файл в main.c: / * Main.c * /
#include "hello.h" int main (void)
{
print_hello ();
}
Так як в проект був доданий новий файл, треба зробити повну зборку ще
раз:
$ Make clean rm -f * .o hello $ make
gcc -c main.c gcc -c hello.c
gcc -o hello main.o hello.o $ ./hello
24
Hello World Goodbye World
$
Програма стала більш правильною, більш витонченою і, найголовніше, більш безпечною.
25
ДОДАТОК
Таблиця 1. Основні параметри команди rm
|
|
Параметр |
Призначення |
|
|
|
|
|
|
||
|
|
-i |
|
видалення з підтвердженням видалення |
|
|
|
||||
|
|
-r |
|
рекурсивне видалення |
|
|
|
|
|
||
|
|
-f |
|
видалення |
всіх |
файлів |
без |
|
|
|
|
|
|
|
|
підтвердження |
|
|
|
|
|
|
|
|
|
-v |
|
докладний опис вироблених дій |
|
|
|
|
|||
|
|
|
|
|
Таблиця 2. Основні параметри команди ls |
||||||
Параметр |
Призначення |
|
|
|
|
|
|
||||
-a |
список файлів і каталогів з прихованими |
|
|
|
|
||||||
-l |
список у один стовпчик (виводиться тип файлу, |
|
|||||||||
|
|
|
права доступу до файлу, кількість жорстких |
|
|||||||
|
|
|
посилань на файл, ім'я власника, ім'я групи, |
|
|||||||
|
|
|
розмір файлу (в байтах), тимчасової штамп та |
|
|||||||
|
|
|
ім'я файлу. |
|
|
|
|
|
|
||
-h |
відображення розмірів файлів у зручному для |
|
|||||||||
|
|
|
людини вигляді (10M, 15K) |
|
|
|
|
|
|||
-i |
Відображення inode елементів |
|
|
|
|
||||||
-t |
сортування за датою модифікації (від старих до |
|
|||||||||
|
|
|
нових) /time |
|
|
|
|
|
|
||
-S |
Впорядкувати за розміром (від великих до |
|
|||||||||
|
|
|
маленьких) /size |
|
|
|
|
|
|
||
-r |
сортування в зворотному порядку |
|
|
|
|
||||||
-R |
Список з підкаталогами |
|
|
|
|
|
|||||
|
|
|
Таблиця 3. Комбінації клавіш текстового редактора nano |
||||||||
|
Ctrl-X |
|
|
закрити редактор |
|
|
|
|
|||
|
Ctrl-O |
|
|
зберегти |
|
|
|
|
|
||
|
|
|
|
|
|
||||||
|
Ctrl-C |
|
|
номер рядка \ поточна позиція |
|
|
|||||
|
Ctrl-W |
|
|
пошук |
|
|
|
|
|
|
|
|
Ctrl- W потім Ctrl-T |
перехід до рядка № |
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
||
|
Ctrl-K |
|
|
вирізати рядок |
|
|
|
|
|
||
|
Ctrl-U |
|
|
вставити з буфера |
|
|
|
|
|||
|
Alt-A |
|
|
виділення (поза X) |
|
|
|
|
|||
|
Alt-6 |
|
|
копіювати в буфер |
|
|
|
|
26
ЛІТЕРАТУРА
1.Тузова І.А. Курс лекцій «Операційна система Unix»
2.Рубльов І.С., Кутяков Д.В. Основи. Файлова система ОС Unix. навчальний посібник
3.Системна довідкова служба Linux Man
4.Робачевскій А.М. «Операційна система Unix®». - СПб .: БВХ - СанктПетербург, 2010. - 528 с, іл.
5.http://rus-linux.net/MyLDP/consol/hdrguide/linux.htm#ln
6.http://valery.narod.ru/hitro/linux.htm
7.http://www.ibm.com/developerworks/ru/library/l-lpic1-v3-104-6/index.html
27