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.

Изисквания към участниците в майсторския клас: Владеене на език C, на ниво книга Б.В. Керниган, Д.М. Ричи "ЕЗИК 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: Конзолен I/O

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

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

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

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

  • Терминално управление с 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 здравей.c -o здравей

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

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

Ако сте прочели моята статия, тогава разбирате за какво говоря. Да, ще инсталираме Geany. Това е чудесна среда за разработка за много езици. Писането на конзолни програми в него е удоволствие.
Отворете конзолата и напишете:
$sudo apt-get инсталирайте 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 здравей.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 изпълнява програмата 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);

иначе ако (оп == "-")

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

иначе ако (op == "*")

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

иначе ако (оп == "/")

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-изход.

gcc -x cpp-изход -c kalkul.cpp

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

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

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

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

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

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

Зареждане...
Връх