Linux програми за програмиране на C. Майсторски клас програмиране на C под Linux

Основно програмиране на Linux с GCC

Операционната система Linux отдавна заема водеща позиция в суперкомпютърния софтуер, тя се нарежда на второ място в сегмента на интернет сървъри и бързо набира популярност в корпоративния сегмент. Това се улеснява от основните предимства на Linux спрямо търговските операционни системи – висока икономическа ефективност, мобилност, гъвкавост, оптимални условия за инсталиране на СУБД.

На нашия курс Linux (Ubuntu). Ниво 2. Програмиране в Linux в C»Ще получите необходимите знания и умения за развитие софтуерза бързо развиващата се операционна система Linux. Ще започнете да разбирате процеса на изграждане на софтуер и спецификата на C компилатора от GCC. Ще се научите да разбирате разликите между процеси и нишки, как да използвате многонишковостта и нейните специфики. Ще научите кои са "демоните" и по какво се различават от приложния софтуер.

В Център "Специалист" обучението по Linux се извършва на примера на най-популярния дистрибуторски комплект Ubuntu. Все пак ще изучавате Linux и след обучение в нашия Център можете лесно да работите с всяка дистрибуция на Linux: Debian, Mandriva, Red Hat, Mint, Alt Linux, Open SUSE, ASP Linux, WSWS и много други.

Програмата на курса отговаря на изискванията на професионалния стандарт „Програмист”.

Добре " Linux (Ubuntu). Ниво 2. Програмиране в Linux в C» включен в изчерпателни програми за обучение системни администратории специалисти по сигурността на Linux. Ученето по изчерпателна програма, вие получавате отстъпка до 15%за няколко курса, включени в програмата наведнъж. Всяка цялостна програма за обучение за Linux се подготвя за международно професионално сертифициране

Стана ясно, че темата е много актуална. Бяха взети предвид някои грешки и въпроси, в резултат на което беше решено да се проведе втори майсторски клас. Добавено и коригирано!

Майсторски клас програмиране на C под Linux. Изучаваме основния API.

Този урок е предназначен за хора, които искат да научат *nix API на подобни операционни системи, по-специално под Linux. Тук ще разгледаме характеристиките на разработката под Linux OS, които включват:


  • Запознаване с процеса на изграждане на софтуер и спецификата на C компилатора от GCC

  • Разработване и използване на споделени библиотеки

  • Програми за отстраняване на грешки

  • Проучване на I/O механизми на файлове от ниско ниво

  • Изучаване на механизми за осигуряване на многозадачност и междупроцесна комуникация

  • Използване на файлови и мрежови сокети

  • Изучаване и приложение на механизма на сигналите

  • Изучаването на процесите, нишките, тяхната разлика, използването на многонишковост, изследването на механизмите за синхронизиране на нишки и техните проблеми

  • Създаване на демони, научаване на разликата между демони и приложния софтуер

  • Проучване на I/O функции на конзолата

  • Файлове, картирани в паметта и как да ги използвате

Този майсторски клас е предназначен предимно за разработчици на софтуер, инженери, програмисти и просто аматьори, които се интересуват от устройството и спецификата на Linux OS.

Изисквания към участниците в майсторския клас: Познаване на език C, на ниво книга B.V. Керниган, Д.М. Ричи "ЕЗИК C".

Цената на този майсторски клас ще бъде 6000 рубли.

Мястото на провеждане е град Москва, в помещенията на Hackspace Neuron.
Дати: Приблизително 4 юли (понеделник), до 7 юли (четвъртък) от 10 до 17 часа с обедна почивка и паузи за чай/кафе.

Онлайн излъчване не е планирано.
Брой хора в групата: 8-10.

Записването се извършва на електронна поща [защитен с имейл]или коментирайте тази публикация. Вашето пълно име е необходимо за регистрация. (изцяло) и данни за контакт (телефонен номер и поща). Желателно е да се опише целта на посещението на този майсторски клас, нивото на обучение и професия.

Подробна програма на курса:

Модул 1: Въведение


  • Запознаване със спецификата на изграждане на софтуер в GNU/Linux

  • Запознаване с конзолни текстови редактори (vi, nano, mcedit)

  • Работа с gdb дебъгера

  • Ръчно и автоматично сглобяване на софтуер (Makefile)

  • Модел клиент-интерфейс-сървър (CIS).

  • Статична сграда на библиотеката

  • Споделени библиотеки

  • Работа с променливи на средата

Модул 2: Ниско ниво I/O и операции с файлове

  • Преглед на Linux I/O механизми (Ubuntu)

  • Файлови дескриптори

  • Системни повиквания: отваряне, затваряне, писане, четене и lseek

  • Типове файлове

  • Inodes и твърди връзки

  • Разрешения за файлове

  • proc файлова система

  • Два начина за четене на съдържанието на директория

  • Редки файлове и специфика на тяхното използване

  • Блокиране на области на файл

Модул 3

  • Linux междупроцесни комуникационни механизми (Ubuntu)

  • Безименни тръби (тръби)

  • Именувани тръби

  • Съобщения (опашка със съобщения)

  • Споделена памет

  • Семафори

Модул 4

  • Сокетове в пространство от имена на файлове (UNIX сокети)

  • Сдвоени гнезда

  • Мрежови гнезда (сокети)

Модул 5. Сигнали

  • Въведение в сигналите

  • Как сигналите се различават от другите комуникационни механизми между процесите

  • Специфика на обработката на сигнали

  • Модул 6

  • Процеси на клониране - fork()

  • Замяна на изпълняващ процес - exec()

  • Зомбита (зомбита) - причини и начини за отстраняването им

Модул 7

  • Нишки и процеси

  • Спецификата на изграждането на многонишкови приложения (multithreading)

  • Прекратяване на нишката по-рано

Модул 8 - Нишки (продължение)

  • Създайте манипулатор за прекратяване на нишка

  • Синхронизирайте примитиви

  • Атрибути на потока

Модул 9: Демони (услуги)

  • Разликата между демон и конзолна помощна програма

  • Специфика на развитието на демони

  • Създаване на демон с помощта на мрежови сокети

Модул 10: Конзолен вход/изход

  • Специфика на разработването на конзолни приложения

  • Предотвратяване на пренасочване на изхода

  • Управление на терминала

  • Скриване на паролата на потребителя по време на удостоверяване

  • Терминален контрол с ESC последователности

Модул 11

  • Показване на обикновен файл

  • Споделяне на файл

  • Частни дисплеи

  • Други приложения на mmap

Модул 12

  • Специфика на разработването на 64-битови приложения

  • Използване на библиотеката ncurses

Ръководител на курса: Сергей Долин. Електронен инженер, разработчик на софтуер за Linux (приложен, тестов софтуер за хардуер, драйвери). Разработчик на вграден софтуер. Linux програмист от 2011 г. Работил в OAO NICEVT, JSC Concern Systemprom, OOO PROSOFT (в дъщерно дружество на Dolamant).

Вече писах за това как да инсталирате пълноправен C и C ++ компилатор на Windows в статията:.

Но тези езици са кросплатформени, освен това мнозина използват Linux не само като домашна система, но и като работен инструмент. Освен това процентът на потребителите на Linux напоследък се е увеличил. И много от тях искат да се научат да програмират. Ето защо днес ще ви кажа как да инсталирате компилатора C и C ++ на Linux система.


Ако използвате Windows, но искате да изпробвате Linux, вижте моите статии за виртуален работен плот:.

И така, Linux е инсталиран, интернет е свързан. Отворете конзолата и напишете командата за инсталиране на компилатора.
$sudo apt-get инсталирайте gcc g++

Това е всичко, компилаторите са инсталирани. Сега остава да проверим.
Отиваме в началната папка и създаваме файла hello.c, отваряме го и пишем проста програма:

#include main() ( printf("Здравей\n"); )

След това отворете конзолата и компилирайте скрипта в програма:
$gcc hello.c -o здравей

Всичко, програмата hello трябва да се появи в папката. Сега нека го стартираме.
$./здравей

Но програмирането в обикновен бележник и компилирането в конзолата е специално извращение. Нуждаем се и от повече или по-малко нормален IDE за програмиране на C и C ++ с вграден компилатор.

Ако четете статията ми, разбирате за какво говоря. Да, ние ще инсталираме Geany. Това е страхотна среда за развитие на много езици. Писането на конзолни програми в него е удоволствие.
Отворете конзолата и напишете:
$sudo apt-get install geany

Съгласни сме с инсталацията и чакаме нейното завършване. След това стартираме програмата.

Отваряме същия файл hello.c в него и го модифицираме малко, след което щракваме върху бутона, подобен на тухла „Събиране на текущия файл“ и стартираме червения бутон „Преглед или стартиране на текущия файл“. И ще имаме конзолен прозорец с резултата.

Инструментите, традиционно използвани за писане на програми за отворени операционни системи, са инструментите за разработчици на GNU. Нека направим малко историческа справка. Проектът GNU е основан през 1984 г. от Ричард Столман. Неговата необходимост се дължи на факта, че по това време сътрудничеството между програмистите беше трудно, тъй като собствениците на търговски софтуер поставяха множество пречки пред това сътрудничество. Целта на проекта GNU беше да се създаде набор от софтуер под един лиценз, който да не позволява на никого да предоставя изключителни права върху този софтуер. Част от този комплект е инструментариумът за разработчици, който ще използваме, който трябва да бъде включен във всички дистрибуции на Linux.

Един от тези инструменти е компилаторът на GCC. Това съкращение първоначално означаваше GNU C Compiler. Сега това означава - GNU Compiler Collection.

Нека създадем първата програма с помощта на GCC. По традиция първата програма просто ще отпечата поздрава "Здравей, свят!" - "Здравей свят!".

Файловете с изходен код за програмите, които ще създаваме, са обикновени текстови файлове и могат да бъдат създадени с всеки текстов редактор (напр. GEdit KWrite, Kate и по-традиционните потребители на Linux vi и emacs). В допълнение към текстовите редактори има специализирани среди за разработка със собствени вградени редактори. Един такъв инструмент е KDevelop. Интересното е, че има вграден редактор и вградена конзола, разположени точно под редактора. Така че можете директно в една програма, без да превключвате между прозорците, и да редактирате кода и да давате команди на конзолата.

Създайте отделна hello директория. Това ще бъде първата ни директория с проекти. В него създавайте текстов файл hello.c със следния текст:

#включи

printf("Здравей свят!\n");

След това в конзолата отидете в директорията на проекта. Наберете екип

Сега погледнете внимателно какво се случи. В директорията се появи нов a.out файл. Това е изпълнимият файл. Нека го стартираме. Въведете в конзолата:

Програмата трябва да стартира, тоест трябва да се появи текстът:

Компилаторът на gcc присвоява името a.out на всички генерирани изпълними файлове по подразбиране. Ако искате да го наименувате по различен начин, трябва да добавите флага -o и името, което искате да го наименувате към командата за компилация. Нека напишем следната команда:

gcc hello.c -o здравей

Виждаме, че в директорията се е появил изпълним файл, наречен hello. Нека го стартираме.

Както можете да видите, резултатът е абсолютно същия изпълним файл, само с удобно за нас име.

Флагът -o е само един от многото флагове на компилатора на gcc. Някои други знамена ще бъдат обсъдени по-късно. Можете да използвате системата за помощ на човека, за да видите всички възможни флагове. Въведете в командния ред:

Ще ви бъде представена помощна система за тази програма. Прегледайте какво означава всяко знаме. С някои от тях ще се срещнем скоро. Помощната система се излиза с клавиша q.

Разбира се, забелязахте, че когато стартираме програма от нашата директория за разработка, въвеждаме точка и наклонена черта преди името на файла. Защо правим това?

Факт е, че ако напишем само името на изпълнимия файл, операционната система ще го търси в директориите /usr/bin и /usr/local/bin и, разбира се, няма да го намери. Директориите /usr/bin и /usr/local/bin са системните директории, където се намират изпълними програми. Първият е предназначен за настаняване стабилни версиипрограми, обикновено включени в дистрибуция на Linux. Вторият е за програми, инсталирани от самия потребител (за стабилността на които никой не гарантира). Такава система е необходима, за да ги отдели един от друг. По подразбиране програмите се инсталират в директорията /usr/local/bin, когато са изградени. Крайно нежелателно е да поставяте нещо допълнително в /usr/bin или да изтривате нещо от там ръчно, защото това може да доведе до срив на системата. Трябва да се поставят програми, за чиято стабилност отговарят разработчиците на дистрибуцията.

За да стартирате програма, разположена другаде, трябва да посочите пълния път до нея, както следва:

/home/dima/projects/здравей/здравей

Или друга опция: напишете пътя спрямо текущата директория, в която се намирате в момента в конзолата. В този случай една точка означава текущата директория, две точки - родителската. Например, командата ./hello стартира програмата hello, разположена в текущата директория, командата ../hello стартира програмата hello, разположена в родителската директория, командата ./projects/hello/hello стартира програмата в поддиректории, разположени вътре текущата директория.

Възможност за добавяне към списъка системни пътищадопълнителни директории за програми. За да направите това, трябва да добавите нов път към системата PATH променлива. Но засега да не се отклоняваме от основната тема. Променливите на средата са отделен разговор.

Сега нека да разгледаме какво прави програмата gcc. Работата му включва три етапа: предварителна обработка, компилация и свързване (или свързване).

Препроцесорът включва съдържанието на всички заглавни файлове, посочени в директивите #include, в основния файл. Заглавните файлове обикновено съдържат декларации за функции, използвани в програмата, но не дефинирани в текста на програмата. Техните дефиниции са някъде другаде: или в други изходни файлове, или в двоични библиотеки.

Вторият етап е компилация. Състои се в превръщането на програмния текст на езика C/C++ в набор от машинни инструкции. Резултатът се съхранява в обектен файл. Разбира се, на машини с различни архитектури на процесора, двоичните файлове се получават в различни формати и е невъзможно да се стартира двоичен файл, изграден на друга машина на една машина (освен ако нямат същата архитектура на процесора и еднакви операционни системи). Ето защо програмите за UNIX-подобни системи се разпространяват като изходни кодове: те трябва да са достъпни за всички потребители, независимо кой какъв процесор и каква операционна система има.

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

Сега нека видим как изглежда всичко на практика. Да напишем друга програма. Това ще бъде най-примитивният калкулатор, способен да събира, изважда, умножава и дели. Когато се стартира, той ще поиска две числа на свой ред, за да работи, и след това ще изисква от вас да въведете знака на аритметичната операция. Може да бъде четири знака: "+", "-", "*", "/". След това програмата показва резултата и спира (връща ни към операционна система, или по-скоро към командния интерпретатор, от който извикахме програмата).

Нека да създадем за проекта нова папка kalkul, ще създадем файла kalkul.c в него.

#включи

printf("Първо число: ");

scanf("%f",&num1);

printf("Втори номер: ");

scanf("%f",&num2);

printf(" Оператор (+ - * /): ");

докато ((op = getchar()) != EOF)

printf("%6.2f\n",num1 + num2);

иначе if(op == "-")

printf("%6.2f\n",num1 - num2);

иначе if(op == "*")

printf("%6.2f\n",num1 * num2);

иначе if(op == "/")

printf("Грешка: деление на нула!\n");

прекъсване;

printf("%6.2f\n",num1 / num2);

И така, на първо място, както беше казано, се извършва предварителна обработка. За да видим какво се прави на този етап, ще използваме опцията -E. Тази опция спира изпълнението на програмата на етапа на обработка от препроцесора. Резултатът е файл програмен кодсъс съдържанието на заглавните файлове, включени в него.

В нашия случай включихме един заглавен файл - stdio.h - колекция стандартни функциивход изход. Тези функции извеждат желания текст в конзолата и също така четат думите, които въвеждаме от конзолата.

Въведете следната команда:

gcc -E kalkul.c -o kalkul.cpp

Нарекохме получения файл kalkul.cpp. Отвори го. Моля, имайте предвид, че е доста дълъг. Това е така, защото включва целия код в заглавния файл stdio.h. В допълнение, препроцесорът добави някои тагове тук, които казват на компилатора как да комуникира с декларираните функции. Основният текст на нашата програма се вижда само в долната част.

Можете също да видите какви други функции са декларирани в заглавния файл stdio.h. Ако искате информация за определена функция, можете да попитате за нея във вградения човек. Например, ако изведнъж искате да знаете какво прави мистериозната функция fopen, можете да напишете:

Има и много информация в помощна системаинформация.

Можете също да попитате за целия заглавен файл наведнъж.

Нека сега да разгледаме следващата стъпка. Нека създадем обектен файл. Обектният файл е "дословен" превод на нашия програмен код на машинен език, но без да свързва извиканите функции с техните дефиниции. Опцията -c се използва за генериране на обектен файл.

Името на получения файл може да бъде пропуснато, тъй като компилаторът просто взема името на изходния файл и променя разширението .c на .o (можете да посочите дали искаме да го именуваме по различен начин).

Ако създаваме обектен файл от източник, който вече е обработен от препроцесора (например този, който получихме по-горе), тогава трябва изрично да посочим, че компилираният файл е файл с изходен код, който е бил обработен от препроцесор и има етикети за препроцесор. В противен случай той ще бъде обработен като обикновен C++ файл, без препроцесорни тагове, което означава, че връзката с декларираните функции няма да бъде установена. Опцията -x се използва за изрично указване на езика и формата на файла, който се обработва. C++ файлът, обработен от препроцесора, се обозначава с cpp-output.

gcc -x cpp-output -c kalkul.cpp

И накрая, последната стъпка е оформлението. Получаваме изпълнимия файл от обектния файл.

gcc калкул.о -о калкул

Можете да го стартирате.

Питате: „Защо цялата тази суматоха с междинни стъпки? Не би ли било по-добре просто да стартирате gcc kalkul.c -o kalkul веднъж?"

Факт е, че истинските програми много рядко се състоят от един файл. обикновено изходни файловеняколко и те се обединяват в проект. И в някои изключителни случаи, програмата трябва да бъде сглобена от няколко части, написани на различни езици. В този случай трябва да стартирате компилатори на различни езици, така че всеки да получи обектен файл от своя изходен код и след това да свържете тези резултиращи обектни файлове в изпълнима програма.

Дмитрий Пантелейчев (dimanix2006 в rambler dot ru) - Въведение в компилатора на GCC

Зареждане...
Горна част