Программирование lin. Программирование в Linux для чайников. Процесс сборки программы

В Linux есть превосходная среда разработки прикладных программ .

Немного о среде программирования Gambas. Язык и среда программирования созданы молодым французом Benoit Minisini из предместий Парижа для собственного удовольствия, которое он получает как от создания компиляторов, так и от на флейте, и от обучения актерскому мастерству, и от работы в качестве профессионального программиста.

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


Пункт меню File , который обычно служит для работы с файлами, в данном случае служит для работы с файлами проекта: New project... (создание нового проекта), Open project... (открыть проект), Open recent (открыть недавний проект), Open example (открыть пример), Save project (сохранить проект), Quit (и выйти).

Для работы над проектом, служит раздел Project :

Это, соответственно, компиляция файла, компиляция проекта, создание исполняемого файла, создание архива исходного текста, создание установочного пакета, свойства проекта, очистка и обновление проекта.

Два пункта меню могут быть непривычны для пользователей Windows – создание архива исходных текстов и установочного пакета. Но не следует забывать, что и программы, и сама операционная система Linux всегда существуют в виде открытых исходных кодов. В Linux можно установить программу двумя способами, либо используя исходный код и средства операционной системы для компиляции и установки программы, либо используя готовый установочный пакет, подобный Setup в Windows. Правда, в разных дистрибутивах Linux такой установочный пакет может быть разным, и не всегда его можно установить, дважды щелкнув мышкой по установочному пакету.

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

Далее следуют разделы вида - View (открывающий и закрывающие все окна диалога рабочей области), инструментов (Tools ) и подсказок (? ). В последнем разделе достаточно подробный Help browser , основанный на Wiki в последней версии программы.

Основная инструментальная панель, как это принято, повторяет наиболее часто используемые разделы основного меню, имеет всплывающие подсказки назначения клавиш.

Графическая работа над формой проекта и кодом программы может вестись быстрым переключением с помощью ярлычков, на рисунке ниже Fmain.form и Fmain.class , щелкая мышкой по которым попадаешь в графический редактор или редактор кода. Каждый из них имеет свое основное инструментальное меню. На рисунке ниже – инструментальное меню графического редактора.

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

По мере создания сложного проекта со множеством форм и собственных классов, можно использовать окно «дерева» проекта.

Запускаем Gambas, который находится в разделе основного меню Приложения :

В разделах, кроме традиционных и необходимых действий, таких как: создать новый проект, открыть существующий, использовать недавно использовавшийся проект, есть раздел примеров (Examples ). Там находится очень много примеров, ими можно пользоваться при работе над собственными проектами.

Чтобы создать новый проект выбираем New project.

Открывается диалог, в котором можно ввести название проекта, его заголовок, указать место, где проект будет располагаться. Gambas хранит все, что относится к проекту, в заданной директории, которая будет носить имя проекта. Для перемещения по диалогу достаточно нажимать клавишу Next , но в самом начале следует выбрать, какого рода проект вы намерены создать. На выбор три варианта – графический проект, терминальный проект, использование копии существующего (вашего или нет) проекта

Выбираем, к примеру, графический проект.

Выбрав графический проект, дав ему имя и место жительства, мы попадаем в среду программирования, которая позволит сделать первый шаг – создать форму. Для этого в правом окне менеджера проекта, где отображается «дерево» проекта, щелкаем правой клавишей мышки по разделу Forms , а в выпадающем меню выбираем раздел New , что приводит к меню выбора, в котором есть пункт Form (создать новую форму). Форма является основным окном программы, которое появится, когда форму заполнить некоторым содержанием, и построить проект. В окне диалога создания формы можно задать имя формы, что важно для средних и больших проектов, содержащих много окон, можно установить ряд опций.

Щелкнув по клавише OK , появляется форма и редактор программы. На форме, видимо, можно будет разместить разные кнопочки, окошки и другие средства программы. А в редакторе поместится все то, что и будет кодом программы.

Форма, как и многие элементы управления, имеет свойство Text , это текст, который появится вместо надписи Form1.Form при выполнении программы. Если щ елкнуть по форме правой клавишей мышки, в выпадающем меню появится пункт Code , который вызывает редактор кода.


Отдельную область занимает инструментарий проекта – Toolbox . Построенный аналогично рабочей области, он тоже имеет различные ярлычки, открывающие страницы, на которых размещаются средства создания проекта.

Окно списка доступных компонентов Gambas

Программа интуитивно понятна и очень удобна, к тому же, благодаря всплавающим подсказкам, сама помогает писать вам программный код.

Оставьте свой комментарий!

Эта статья расчитана на два вида читателей. Во-первых, это люди, имеющие опыт программирования под MS Windows, но не имеющие такого опыта под GNU/Linux. Во-вторых, это люди, не имеющие опыта программирования вовсе. Однако, я предполагаю, что читатель в общем знаком с общепринятой в программировании терминологией, и ему не нужно объяснять, например, что такое «программа», «функция», «компилятор» или «отладка».

Средства разработки

Я буду рассматривать разработку с использованием тех средств, которые являются наиболее «родными» для GNU/Linux. К ним относятся:

    Язык программирования C

    Командная оболочка bash

    Текстовые редакторы Vim и Emacs

    Компилятор GCC

    Отладчик GDB

    Утилита для сборки проекта GNU make

    Система управления версиями Git

    Оконная система X11

Выбор именно этих средств не является догмой. Каждое из выше перечисленных средств может быть при желании заменено на другое. Однако, обычно под фразами наподобие «среда разработки Linux» понимается именно этот набор инструментов.

Языки программирования

Наиболее «родным» языком программирования для GNU/Linux является C. Это обусловлено следующими факторами:

    GNU/Linux заимствует многие идеи (практически, идеологию) операционной системы UNIX;

    Операционная система UNIX была написана на языке C (собственно, этот язык создавался именно для написания этой ОС);

    Соответственно, ядро Linux и системное окружение GNU написаны тоже на C.

Ниже я буду рассматривать разработку с использованием языка C. Однако, этот выбор не является догмой. Другими популярными при разработке под GNU/Linux языками являются C++, Python, Perl. Конечно, могут использоваться и любые другие языки.

Среда разработки

В течение последних двух десятилетий очень широкое распространение получили т.н. IDE — интегрированные среды разработки. Такая среда включает в себя текстовый редактор, компилятор, отладчик, средства сборки проекта и мн.др. Такие среды есть и под GNU/Linux (наиболее популярны Eclipse, NetBeans, IDEA, KDevelop, Anjuta). Однако, история разработки под UNIX-подобные системы показывает, что IDE не являются не только единственным, но и наиболее эффективным средством разработки. Практически, правильный ответ на вопрос «какая самая лучшая IDE под GNU/Linux» — это «GNU/Linux это и есть IDE».

Часто можно встретить мнение, что большой проект без IDE разрабатывать невозможно. Это мнение легко опровергается. Первые версии UNIX писались даже не в Vim (его тогда ещё не было), а в Ed. Это так называемый «построчный» текстовый редактор, в котором вы можете редактировать за раз только одну строку текста. Весь файл на экране не отображается. В случае с UNIX по-другому и быть не могло — у разработчиков не было никаких экранов, а общение с системой осуществлялось при помощи телетайпов. Современное ядро Linux пишется в основном в редакторах Emacs и Vim.

Многие утилиты UNIX вызывают «текстовый редактор по умолчанию». Команда, запускающая текстовый редактор по умолчанию, берётся из переменной окружения $EDITOR . Некоторые утилиты смотрят сначала в переменную $VISUAL , и, лишь если она не установлена, в переменную $EDITOR . Это исторически сложившееся поведение: к старым компьютерам зачастую не было подключено никакого дисплея, а только телетайп, поэтому запускать экранный (визуальный) редактор смысла не было. В современных дистрибутивах обычно по умолчанию оказывается EDITOR=vi или EDITOR=nano . Указать использование другого редактора для одной команды можно так:

EDITOR=emacs some-command

Чтобы использовать нужный редактор по умолчанию всегда, нужно добавить в файл ~/.profile строчку типа

export EDITOR=emacs

Исторически сложилось так, что «настоящими» текстовыми редакторами для программистов являются только Vim и Emacs (просто из-за того, что у них самая долгая история развития именно в качестве текстовых редакторов для программистов). Остальные редакторы находятся в положении догоняющих.

Командная оболочка

Командная оболочка (или командный интерпретатор) — это программа, принимающая команды от пользователя на некотором достаточно простом языке программирования и выполняющая их. Большинство команд запускают одноимённые программы. Отдельные команды представляют собой конструкции языка программирования оболочки.

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

ОС семейств DOS и Windows заимствовали некоторые функции командной оболочки из UNIX, однако их авторы пошли на существенные упрощения, из-за чего функционал COMMAND.COM и cmd.exe получился сильно урезанным. PowerShell вполне на уровне, но работает существенно по-другому.

В рамках этой статьи я ограничусь использованием командной оболочки bash (как наиболее распространённой и используемой по умолчанию в большинстве дистрибутивов) для запуска компилятора и других средств разработки. Хороший обзор использования командной оболочки можно найти, например, в известной книге .

Документация

Все средства разработки и библиотеки в GNU/Linux обычно довольно хорошо документированы. Традиционно для документации используется специальный формат и утилита для его просмотра — man . Документация в системе делится на несколько разделов:

    Команды пользователя (например, ls, gcc или man)

    Системные вызовы — API ядра ОС

    Библиотечные функции

    Драйвера и т.п

    Форматы файлов

    Игры и т.п

    Различные обзоры подсистем

    Команды, используемые для системного администрирования

Для вызова раздела документации по имени нужно указать это имя при вызове команды man (например, man ls). Иногда разделы с одинаковым названием есть сразу в нескольких разделах документации документации. Указать конкретный раздел можно при вызове man (например, man 3 printf).

Более подробную информацию о справочной системе man см. в man man .

Утилиты системного окружения GNU часто используют для документации формат info. См., например, info Coreutils .

Компилятор

Сейчас существует много компиляторов языка C, более-менее совместимых с различными стандартами. Тем не менее, пока что в среде GNU/Linux наиболее применимым остаётся компилятор C, входящий в комплект GNU Compilers Collection (GCC). Этот компилятор, кроме стандарта C, поддерживает некоторое количество расширений стандарта. Эти расширения, в частности, широко используются в исходных текстах ядра Linux. В последнее время появляются компиляторы, способные скомпилировать ядро Linux (например, llvm-clang, или EKO).

Компилятор GCC запускается из командной оболочки командой вида

gcc program.c

где program.c — имя входного файла. Кроме того, по стандарту POSIX, компилятор может быть запущен командой cc program.c (cc — от "C compiler").

При обычном запуске компилятор пытается создать исполняемый файл. По умолчанию, выходной файл называется a.out (такое название осталось от древних версий UNIX). Другое название можно задать с помощью опции компилятора -o , например,

gcc -o program program.c

При сборке программы из нескольких модулей компилятору можно подавать на вход несколько исходных файлов или файлов объектного кода, например,

gcc -o program main.c module1.o module2.o …

Чтобы только скомпилировать один исходный файл в объектный код (не пытаясь собрать исполняемый файл), нужно дать команду вида

(имя выходного файла по умолчанию будет module.o).

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

Статическая библиотека в UNIX-подобных системах представляет собой архив (старинного формата ar), включающий набор объектных файлов. Такой архив создаётся командой вида

ar r libsomething.a module1.o module2.o …

Имена файлов библиотек традиционно начинаются с префикса lib .

Динамически загружаемая библиотека представляет собой объектный файл специального формата (расчитанного на динамическую загрузку). Такая библиотека создаётся командой вида

gcc -shared -o libsomething.so module1.c module2.c …

Для использования библиотеки при сборке программы её нужно указать компилятору при помощи опции -l , например

gcc -o program -lm program.c

(здесь будет использоваться файл библиотеки libm.so , префикс lib компилятор подставляет по умолчанию). По умолчанию компилятор собирает программу, использующую динамические библиотеки. Если нужно использовать статические версии библиотек, компилятору нужно указать опцию -static .

Подробную информацию об опциях gcc см. в man gcc .

Hello, world!

Считается, что традиция начинать изучение языка программирования с написания программы, выводящей строку "Hello, world!", пошла с книги Кернигана и Ричи "Язык C" . В случае с языком C эта программа выглядит следующим образом:

#include

int main (int argc, char * argv) {
printf ("Hello world! \n " );
return 0 ;
}

Чтобы запустить эту программу, этот текст нужно записать в файл с именем, скажем, hello.c , и из директории, в которой расположен этот файл, дать команду вида

gcc -o hello hello.c

Впрочем, в случае такой простой программы достаточно дать команду

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

Порядок сборки

Остановимся несколько подробнее на том, что именно делает компилятор. Порядок действий компилятора C традиционен, и применяется компиляторами некоторых других языков.

На входе компилятор имеет в общем случае набор файлов с исходными текстами. Перед началом собственно компиляции эти файлы обрабатываются т.н. препроцессором (программа cpp). Главная функция этой программы — выполнение директив вида #include . Встретив такую директиву, препроцессор вставляет содержимое указанного файла (в данном случае, stdio.h) на место этой директивы. Препроцессор понимает ещё некоторые директивы, но сейчас на них останавливаться я не буду.

После препроцессора выполняется собственно компиляция. Из исходных файлов на этом этапе получаются т.н. объектные файлы. Это файлы, содержащие исполняемый машинный код, но ещё не готовые для запуска. Главное, чего в них недостаёт — это адреса вызываемых библиотечных функций. Например, код функции printf() содержится в библиотеке libc . А в объектном файле содержится только имя этой функции. Кроме того, объектный файл содержит имена всех объявленных в нём функций.

Объектные файлы, а также используемые библиотеки подаются на вход компоновщику (программа ld). Компоновщик ищет все вызываемые из различных объектных файлов функции (по именам) в объектных файлах и в библиотеках. Если все функции найдены, то компоновщик собирает собственно исполняемый файл. При этом имена вызываемых функций заменяются на конкретные адреса памяти. В случае использования динамической библиотеки имя используемой функции остаётся, и к нему добавляется имя файла динамической библиотеки, в которой при запуске программы нужно будет искать эту функцию.

Собственно программа gcc представляет собой так называемый драйвер (driver). Она запускает упомянутые выше программы (или только некоторые из них, в зависимости от опций), чтобы получить исполняемый файл.

Второй пример: решение квадратных уравнений

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

#include
#include

/* solve: calculate roots of square equation.
* a, b, c are coefficients in equation.
* Roots would be stored at x1, x2.
* Return value: count of real roots.
*/
int solve(double a, double b, double c,
double* x1, double* x2) {
double D = b*b - 4*a*c;
double sqrtD;

if (D > 0) {
sqrtD = sqrt(D);
*x1 = (-b - sqrtD)/(2.0 * a);
*x2 = (-b + sqrtD)/(2.0 * a);
return 2;
} else if (D < 0)
return 0;
else {
*x1 = -b/(2.0*a);
return 1;
}
}

int main (int argc, char* argv) {
double a,b,c;
double x1, x2;
int roots_count;

// Input coefficients
printf("A: ");
scanf("%lf", &a);
printf("B: ");
scanf("%lf", &b);
printf("C: ");
scanf("%lf", &c);

// Solve the equation
roots_count = solve(a,b,c, &x1, &x2);

// Output results
switch (roots_count) {
case 0:
printf("No (real) roots.\n");
break;
case 1:
printf("One root: %0.4lf\n", x1);
break;
case 2:
printf("Two roots: %0.4lf and %0.4lf\n",
x1, x2);
break;
}

По аналогии с предыдущим примером, запишем этот текст в файл square.c и попытаемся скомпилировать его командой

gcc -o square square.c

Но на этот раз мы получим ошибку примерно такого вида:

/tmp/cc6RNFIi.o: In function `solve": square.c:(.text+0x6d): undefined reference to `sqrt" collect2: ld returned 1 exit status

В чём здесь дело? Ясно, что компилятору почему-то не понравился вызов функции sqrt() . Причём, он жалуется уже не на файл исходного кода, а на объектный файл (вот этот cc6RNFIi.o). Это означает, что исходный файл благополучно скомпилировался, а проблемы возникли на стадии компоновки (что можно видеть и по упоминанию в тексте ошибки программы ld — это стандартный в GNU/Linux компоновщик). Компоновщик не смог найти функцию sqrt() . В данном случае, это произошло из-за того, что эта функция содержится в библиотеке libm , а мы не просили компилятор использовать её. Чтобы избавиться от этой ошибки, нам нужно изменить команду компиляции на следующую:

gcc -o square -lm square.c

Такая команда должна отработать без ошибок и создать исполняемый файл square .

При сборке любой достаточно сложной программы нам придётся использовать несколько библиотек, и, возможно, понадобится указывать ещё какие-то опции компилятору. Команда может получиться довольно длинная. Что же, каждый раз набирать её вручную? Нет. Один из принципов философии UNIX гласит: «Всё, что может быть автоматизировано, должно быть автоматизировано». Здесь нам пригодится одна из древнейших UNIX-утилит — программа make . Чтобы воспользоваться ею, нужно написать файл с именем Makefile (в той же директории, что и наш исходный файл) со следующим содержимым:

square: square.c $(CC) -o $@ -lm $<

Теперь собрать исполняемый файл можно просто дав команду make . Как это работает?

Make

Утилита make предназначена для сборки программ (хотя может использоваться для автоматизации многих других похожих задач). Она читает файл с именем Makefile и видит в нём набор правил. Каждое правило определяет три вещи: цель (goal, т.е. то, что нужно собрать), список исходных файлов и набор команд, которые нужно выполнить, чтобы собрать цель из исходных файлов. В примере выше, square — это имя цели, square.c — единственный в данном случае исходный файл (если их несколько, они перечисляются через пробел), а вторая строчка — команда. В команде могут использоваться переменные. Некоторые из переменных имеют специальное значение. В частности, в любом правиле $@ обозначает имя цели, а $< — первый исходный файл. Переменная $(CC) указывает на компилятор C, используемый в системе по умолчанию (в большинстве случаев это gcc , но бывает и что-нибудь другое).

В имени цели и списке исходных файлов может использоваться подстановочный символ % . Например, такое правило:

%.o: %.c $(CC) -c $<

обозначает, что файлы с именем, заканчивающимся на.o , нужно собирать из соответствующих файлов с суффиксом.c .

Кроме того, make заранее знает некоторое количество правил по умолчанию. Среди них есть упомянутое в последнем примере, а также правило

%: %.c $(CC) -o $@ $<

Благодаря этому правилу, в примере с «Hello, world!» просто команда make hello запускала cc -o hello hello.c .

По набору правил make составляет граф зависимостей целей друг от друга и от исходных файлов, и выполняет только те команды, которые нужны для сборки цели, указанной в командной строке. Если не указано никаких целей, то собирается первая цель, описанная в Makefile .

Более подробную информацию об этой утилите см., например, в man make .

Управление версиями

Для управления версиями исходного кода может использоваться любая VCS. Однако, раз уж мы говорим о GNU/Linux, рассмотрим вкратце систему, используемую для разработки ядра Linux: git. По git существует довольно обширная документация, в т.ч. и на русском языке. См. например, мою статью или известную серию статей .

Для начала использования git нужно создать репозиторий — хранилище для версий файлов. Это делается командой

Теперь можно добавлять файлы в репозиторий. Но нам не нужно отслеживать версии некоторых файлов, а именно: объектных файлов и исполняемых файлов. Чтобы сразу исключить их из рассмотрения git, напишем файл.gitignore следующего содержания:

*.o square hello

Теперь команда

добавит в репозиторий все файлы в текущей директории, кроме упомянутых в файле.gitignore . После этого можно делать коммит командой

По этой команде откроется текстовый редактор по умолчанию. Тут нужно будет написать комментарий к коммиту. В данном случае достаточно строчки типа «Initial commit».

Отладка

Для отладки в Linux используется отладчик gdb . Но сначала, для того, чтобы программу было удобно отлаживать, её нужно скомпилировать с опцией -g . Сейчас нам достаточно изменить Makefile , приведя его к виду

square: square.c $(CC) -o $@ -lm -g $<

и пересобрать программу.

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

Отладка запускается командой вида

gdb ./some-program -a -b

При запуске отладчика появляется приглашение командной строки вида:

GNU gdb (GDB) 7.2-ubuntu Copyright (C) 2010 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i686-linux-gnu". For bug reporting instructions, please see: ... Reading symbols from /home/portnov/LUG/src/square...done. (gdb)

Работа с отладчиком, в общих чертах, напоминает работу с командной оболочкой. Вы вводите команды, отладчик их исполняет. Как и в командной оболочке, работает автодополнение команд по клавише Tab. Кроме того, для краткости можно сокращать команды до первых нескольких букв — лишь бы избежать неоднозначности.

К наиболее часто используемым командам относятся:

Напечатать очередной кусок исходника (печатается 10 строк). Можно указать конкретные номера строк после имени команды, например l 10,15 .

Запустить программу на выполнение под отладчиком. Программа будет выполняться до ближайшей точки останова, или до конца.

Установить точку останова. Номер строки, на которой нужно установить точку останова, указывается после имени команды.

Выполнить одну строку программы.

Вычислить и напечатать выражение. Выражение указывается после команды. Таким образом можно, например, однократно посмотреть значение какой-нибудь переменной.

Добавить выражение к списку постоянно отображаемых. Значения этих выражений будут показываться после исполнения каждой команды. Рядом с каждым выражением печатается его номер в списке. Удалить выражение из списка можно командой undisplay с номером выражения.

Выход из отладчика.

Более подробную информацию по GDB см. в man gdb .

Оконная система X11

Исторически в UNIX не было и не могло быть никакой графической среды, потому что не было графических дисплеев. Графическая среда для UNIX появилась примерно тогда, когда появились распространённые графические дисплеи: в 1984. Сначала она называлась W (от Window), затем её усовершенствовали и назвали следующей буквой алфавита — X, следующая версия называлась X2… Сейчас имеем X11.

X11 представляет собой, прежде всего, сетевой протокол поверх TCP/IP и UDP/IP. У протокола есть клиент и есть сервер. Клиент посылает последовательность запросов вида «нарисуй мне окошко», «нарисуй на нём кнопочку», а сервер их исполняет. Один из главных принципов X11 — «определять механизмы, а не политики». Протокол предоставляет возможность, скажем, рисовать окошки, а как именно они будут отображаться — не определяет.

Наиболее распространённым X-сервером сейчас является Xorg (http://x.org); всё ещё жив XFree86; под Windows актуален Xming; выпускаются аппаратные X-серверы — комплекты «монитор + клавиатура + мышка», в которых поддержка серверной функциональности X11 реализована аппаратно — такие комплекты используются в качестве графических терминалов.

Протокол X11, в отличие от, скажем, HTTP, является бинарным, а не текстовым — это сделано из соображений экономии пропускной способности сетевого соединения и простоты разбора запросов сервером. Но это усложняет создание клиентов этого протокола: собирать замысловатые бинарные X11-запросы заведомо сложнее, чем, например, текстовые HTTP-запросы. Поэтому для написания X-клиентов используются специальные библиотеки функций, формирующих и отправляющих серверу X-запросы. Наиболее распространена библиотека libX11. Более современным вариантом является libxcb.

Запросы X11 весьма низкоуровневые. Например, чтобы реализовать функциональность кнопки, нужно нарисовать в окне прямоугольник, написать в нём текст, ждать в цикле нажатия кнопки мыши, и при каждом нажатии проверять, где щёлкнули — внутри прямоугольника или вне него. Поэтому стали появляться так называемые тулкиты — библиотеки, являющиеся высокоуровневыми обёртками над libX11.

Исторически первым тулкитом был Athena3D. Потом были Motif и Tk. Сейчас наиболее распространены GTK+ и Qt (Qt, строго говоря, представляет собой не X11-тулкит, а многоцелевой кроссплатформенный набор библиотек, который может использоваться в качестве X11-тулкита).

Hello, world на GTK+

В качестве примера рассмотрим следующую программу. Она показывает окно с одной кнопкой. При нажатии на эту кнопку появляется сообщение «Hello, world».

#include

// This function displays message dialog.
// main_window parameter should be set to parent window of the dialog.
void message_box (GtkWindow* main_window, gchar *message) {
GtkWidget *dialog, *label, *content_area;

// Create a dialog
dialog = gtk_dialog_new_with_buttons ("Message",
main_window,
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_STOCK_OK,
GTK_RESPONSE_NONE,
NULL);
// Create a label
content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
label = gtk_label_new (message);

// On "response" signal (it"s called when user clicks a button in
// the dialog), destroy the dialog.
g_signal_connect_swapped (dialog,
"response",
G_CALLBACK (gtk_widget_destroy),
dialog);

// Add a label
gtk_container_add (GTK_CONTAINER (content_area), label);
// Show the dialog
gtk_widget_show_all (dialog);
}

// Callback for delete-event signal
static gboolean delete_event(GtkWidget *widget,
GdkEvent *event,
gpointer data)
{
// If return TRUE, window will not be closed.
// This may be used to preven closing window in some situations.
return FALSE;
}

// Callback for destroy signal
static void destroy(GtkWidget *widget,
gpointer data)
{
// End main GTK+ event loop
gtk_main_quit ();
}

// Callback for button click
static void hello (GtkWidget *widget,
gpointer data)
{
// "data" parameter represents main window here
message_box(GTK_WINDOW(data), "Hello, world!");
}

int main(int argc,
char *argv)
{
GtkWidget *window;
GtkWidget *button;

// Init GTK+
gtk_init (&argc, &argv);

// Create main window
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

// Set up callbacks for some signals
g_signal_connect (window, "delete-event",
G_CALLBACK (delete_event), NULL);

G_signal_connect (window, "destroy",
G_CALLBACK (destroy), NULL);

// Set window borders width
gtk_container_set_border_width (GTK_CONTAINER (window), 10);

// Create labeled button
button = gtk_button_new_with_label ("Hello World");

// Set up callback for "clicked" signal of the button.
// Pass main window as second parameter.
g_signal_connect (button, "clicked", G_CALLBACK (hello), (gpointer)window);

// Pack the button into window
gtk_container_add (GTK_CONTAINER (window), button);

// Show the button
gtk_widget_show (button);

// Show the window
gtk_widget_show (window);

// Run main GTK+ event loop.
gtk_main ();

Собирается эта программа командой вида

gcc -o gtk-hello $(pkg-config --cflags gtk+-2.0) $(pkg-config --libs gtk+-2.0) gtk-hello.c

Дополнительная литература

Реймонд, Эрик С. Искусство программирования для UNIX. — Пер. с англ. — М.: Издательский дом «Вильямс», 2005. — 544с., ил.

Керниган Б., Пайк Р. UNIX. Программное окружене. — Пер с англ. — СПб: Символ-Плюс, 2003. — 416с., ил.

Керниган Б., Ритчи Д. Язык программирования C. — Пер. с англ. — Москва: Вильямс, 2006. — 304 с.

Книги о программировании под Linux, скачать бесплатные книги, самоучители и учебники о программировании под Linux в хорошем качестве

Описание книги UNIX. Разработка сетевых приложений : Новое издание книги, посвященной созданию web-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию.

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

Описание книги Python в системном администрировании UNIX и Linux :
Книга «Python в системном администрировании UNIX и Linux» демонстрирует, как эффективно решать разнообразные задачи управления серверами UNIX и Linux с помощью языка программирования Python. Каждая глава посвящена определенной задаче, например многозадачности, резервному копированию данных или созданию собственных инструментов командной строки, и предлагает практические методы ее решения на языке Python.

Среди рассматриваемых тем: организация ветвления процессов и передача информации между ними с использованием сетевых механизмов, создание интерактивных утилит с графическим интерфейсом, организация взаимодействия с базами данных и создание приложений для Google App Engine. Кроме того, авторы книги создали доступную для загрузки и свободно распространяемую виртуальную машину на базе Ubuntu, включающую исходные тексты примеров из книги и способную выполнять примеры, использующие SNMP, IPython, SQLAlchemy и многие другие утилиты.

Издание рассчитано на широкий круг специалистов — всех, кто только начинает осваивать язык Python, будь то опытные разработчики сценариев на языках командной оболочки или относительно мало знакомые с программированием вообще.

Описание книги GCC. Настольная книrа пользователей, проrраммистов и системных администраторов : GCC — основной компилятор проекта GNU. Он поддерживает набор всех наиболее используемых языков программирования и обеспечивает перенос программ на десятки аппаратных платформ. Все свободно распространяемое программное обеспечение, включая и компиляторы, на том или ином уровне основываются на GCC.

В книге даются подробные сведения о получении, конфигурировании, установке и тестировании компилятора. Представлено построение кросс-компилятора и создание встраиваемых систем, детально описывается компиляция программ на языках С, C++, Objective-C, Fortran, Java и Ada. А также сочетание в одной программе нескольких языков программирования и включение в нее частей, написанных на ассемблере или языках системного уровня. В этой книге можно найти практически любые сведения, достаточные не только для разрешения ваших проблем, но и для участия в разработке и поддержке самого компилятора GCC.Книга будет полезна: программистам-разработчикам и руководителям программных проектов; администраторам и системным программистам, которым приходится заниматься переносом программного обеспечения и приложений; пользователям, заинтересованным в использовании программ с открытым исходным кодом. И всем сторонникам развития движения по созданию свободно распространяемых программ.

Описание книги Linux. Системное программирование :
Эта книга о том, как создавать программное обеспечение под Linux, эффективно используя возможности системы — функции ядра и базовые библиотеки, включая оболочку, текстовый редактор, компилятор, отладчик и системные процедуры. Большая часть программного кода для Unix и Linux написана на системном уровне, поэтому в книге основное внимание сфокусировано на приложениях, находящихся вне ядра, таких как Apache, bash, cp, vim, Emacs, gcc, gdb, glibc, ls, mv и прочих.

Книга написана специально для разработчиков и является необходимым инструментом любого программиста.

  1. Введение и важнейшие концепции
  2. Файловый ввод-вывод
  3. Буферизованный ввод-вывод
  4. Расширенный файловый ввод-вывод
  5. Управление процессами
  6. Расширенное управление процессами
  7. Управление файлами и каталогами
  8. Управление памятью
  9. Сигналы
  10. Время

Описание книги Основы программирования в Linux :
В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек С/C++ и стандартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др.

Описана компиляция программ, их компоновка с библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME и KDE, хранения данных с использованием СУБД MySQL и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым.

  • Приступая к работе
  • Программирование средствами командной оболочки
  • Работа с файлами
  • Окружение Linux
  • Терминалы
  • Управление текстовыми экранами с помощью библиотеки curses
  • Управление данными
  • MySQL
  • Средства разработки
  • Отладка
  • Процессы и сигналы
  • Потоки POSIX
  • Связь между процессами: каналы
  • Семафоры, совместно используемая память и очереди сообщений
  • Сокеты
  • Программирование в GNOME с помощью GTK+
  • Программирование в KDE с помощью Qt
  • Стандарты Linux

  • Sivarama P. Dandamudi
  • Издательство: Springer
  • Год: 2005
  • Язык: Англий ский
  • Страниц: 568
  • Формат: pdf
  • Размер: 26 МБ

Описание книги :
This unique guide provides comprehensive coverage of the key elements of Assembly language programming with in-depth coverage of the Linux operating system, which is the fastest-growing operating system with an estimated 18 million Linux users worldwide. The book specifically targets professionals who would like to learn Assembly and intend or expect to move to the Linux operating system.

This highly useful guidebook comes complete with all the necessary software (Linux, NASM, debugger), making it an extremely valuable resource tool for all those who want to learn Assembly programming and Linux. Readers need only have a basic knowledge of any structured, high-level language such as C to obtain the full benefits of this guidebook. Sivarama P. Dandamudi is a professor of computer science at Carleton University in Ottawa, Ontario, Canada, as well as associate editor responsible for computer architecture at the International Journal of Computers and Their Applications. He has more than two decades of experience teaching about computer systems and organization.

  • Computer organization, including digital logic circuits, memory organization, IA-32 architecture
  • Installing and using Linux and NASM
  • Debugging assembly language programs
  • Overview of assembly language instructions
  • Writing procedures, addressing modes, conditional execution, logical and bit operations
  • Advanced assembly language, including string processing, ASCII and BCD arithmetic, recursion, protected-mode interrupt processing, high-level language interface, floating-point operations

Описание книги Pro Oracle Database 11g RAC on Linux :
Pro Oracle Database 11g RAC on Linux provides full-life-cycle guidance on implementing Oracle Real Application Clusters in a Linux environment. Real Application Clusters, commonly abbreviated as RAC, is Oracle’s industry-leading architecture for scalable and fault-tolerant databases. RAC allows you to scale up and down by simply adding and subtracting inexpensive Linux servers. Redundancy provided by those multiple, inexpensive servers is the basis for the failover and other fault-tolerance features that RAC provides.

Written by authors well-known for their talent with RAC, Pro Oracle Database 11g RAC on Linux gives you a rock-solid and technically flawless foundation on which to build your RAC-management skills. Authors Julian Dyke and Steve Shaw share their hard-won experience in building RAC clusters, showing you how to build for success using the very latest Oracle technologies, such as Automatic Storage Management (ASM) and Oracle Clusterware. You’ll learn to troubleshoot performance and other problems. You’ll even learn how to correctly deploy RAC in a virtual-machine environment based upon Oracle VM, which is the only virtualization solution supported by Oracle Corporation.

RAC is a complex and powerful technology. It demands expertise in its deployment. You can’t just “wing it” in creating a RAC solution. Julian and Steve have earned the right to term themselves expert-in Pro Oracle Database 11g RAC on Linux, they offer a rigorous and technically-correct treatment of RAC that helps you build a solid foundation of expertise and achieve success.

Описание книги Python for Unix and Linux System Administration :
Python is an ideal language for solving problems, especially in Linux and Unix networks. With this pragmatic book, administrators can review various tasks that often occur in the management of these systems, and learn how Python can provide a more efficient and less painful way to handle them.

Each chapter in Python for Unix and Linux System Administration presents a particular administrative issue, such as concurrency or data backup, and presents Python solutions through hands-on examples. Once you finish this book, you"ll be able to develop your own set of command-line utilities with Python to tackle a wide range of problems.

Discover how this language can help you:

* Read text files and extract information
* Run tasks concurrently using the threading and forking options
* Get information from one process to another using network facilities
* Create clickable GUIs to handle large and complex utilities
* Monitor large clusters of machines by interacting with SNMP programmatically
* Master the IPython Interactive Python shell to replace or augment Bash, Korn, or Z-Shell
* Integrate Cloud Computing into your infrastructure, and learn to write a Google App Engine Application
* Solve unique data backup challenges with customized scripts
* Interact with MySQL, SQLite, Oracle, Postgres, Django ORM, and SQLAlchemy

With this book, you"ll learn how to package and deploy your Python applications and libraries, and write code that runs equally well on multiple Unix platforms. You"ll also learn about several Python-related technologies that will make your life much easier.

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

Описание книги Программирование на C++ в Linux :
Книга посвящена созданию приложений, написанных на языке C++, в среде разработки KDevelop. Дано описание способов взаимодействия компонентов приложений. Рассмотрена работа с утилитой Qt Designer и описаны основные элементы управления, используемые в диалоговых окнах, а также классы, созданные для работы с ними. Читатель знакомится с концепцией Документ/Представление и учится создавать элементы пользовательского интерфейса приложения. Кроме того, в отдельных главах разбираются вопросы вывода на экран различной информации, сохранения и восстановления ее из файла, создания текстовых редакторов, работы с шаблонами классов и функций и организации многозадачности в приложении на основе взаимодействующих процессов. В завершение предоставляются рекомендации по созданию справочной системы приложения.

В книге идет речь о программировании GUI приложений с использованием Qt4 и среды разработки KDevelop.

Мы собрали для вас 10 лучших видеокурсов, изучение которых поможет вам начать работу с Linux и разобраться в особенностях данной системы.

1. Linux для начинающих

Начнем с обучающего видеокурса по Линукс, в котором рассказывается о системе в целом и о начале работы с ней. Данный видеокурс больше подходит для тех, кто только начинает свое знакомство с Линукс.

2. Серия уроков «Научись Линукс»

Данный видеокурс предназначен для начала работы с Линукс. Поможет в установке данной системы на ваш ПК. Аудитория данного видеокурса — это люди, которые немного, но слышали про Линукс.

3. Курс лекций по администрированию Линукс

Подробный видеокурс по администрированию Линукс. Он рассматривает разные вопросы: от предназначения данной системы до администрирования MySQL. Подходит как новичкам, так и уже опытным пользователям Линукс.

4. Программирование на Bash

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

5. Администрирование Линукс

Данный курс обеспечит вас базовыми знаниями Линукс и поможет получить сертификат LPIC-1. Если вы хотите подкрепить свои знания сертификатом LPIC-1, то этот курс точно для вас.

6. Основы Линукс

Небольшой видеокурс по основам работы с Линукс. Если вы хотите начать именно с данного видеокурса, то рекомендую ознакомиться с установкой Линукс, так как в данном видеокурсе рассматриваются аспекты работы непосредственно в самой системе.

7. Основы работы с командной строкой

Небольшой, но очень полезный англоязычный туториал по работе с командной строкой Линукс. В данном видеокурсе вы научитесь таким простым операциям, как создание и удаление файлов или директорий. Подходит для всех, кто хочет расширить свои знания работы в Линукс.

8. Видеокурс по GNU/Linux Владимира Моженкова

Видеокурс по основам работы с GNU/Linux, простой и понятный. Данный видеокурс нацелен как на новичков, так и на опытных пользователей Линукс.

9. Серия уроков «Ваш путь в мир Линукс!»

Данный видеокурс рассказывает о работе с такими вещами, как системный планировщик Cron и переменная path. Советую не начинать с данного курса, пока не ознакомитесь с одним из предыдущих.

10. Администрирование Linux

Последним в нашем списке идет видеокурс, в котором подробно рассказываются все аспекты работы с Линукс. Данный видеокурс расширит знания опытных пользователей, курс рассчитан на тех, кто уже как-то знаком с Линукс, но хочет знать о нём больше.

Название : Программирование на C++ в Linux.

Книга "Программирование на C++ в Linux" посвящена разработке приложений на С++ в среде разработки KDEvelop. Автор книги дает подробное описание взаимодействий компонентов приложений, рассматривает основы работы с утилитой Qt Designer и обсуждает элементы управления в диалоговых окнах и классы, для которых они созданы. Книга учит концепции Документ/Представление, созданию элементов интерфейса приложения. Затрагиваются и такие темы, как сохранение и восстановление различной информации, выводимой на экран, разработке текстовых редакторов, организации многозадачности в приложениях на основе взаимодействующих процессов, работе с шаблонами классов и функций. Как заключение, автор дает полезные рекомендации по созданию справочной системы для разработанного приложения. Книга предназначена для профессиональных программистов.


Книга посвящена созданию приложений, написанных на языке C++, в среде разработки KDevelop. Дано описание способов взаимодействия компонентов приложений. Рассмотрена работа с утилитой Qt Designer и описаны основные элементы управления, используемые в диалоговых окнах, а также классы, созданные для работы с ними. Читатель знакомится с концепцией Документ/Представление и учится создавать элементы пользовательского интерфейса приложения. Кроме того, в отдельных главах разбираются вопросы вывода на экран различной информации, сохранения и восстановления ее из файла, создания текстовых редакторов, работы с шаблонами классов и функций и организации многозадачности в приложении на основе взаимодействующих процессов. В завершение предоставляются рекомендации по созданию справочной системы приложения.

Содержание :
Введение
Для кого предназначена эта книга?
Структура книги
Соглашения, принятые в данной книге
Требования к аппаратным средствам и программному обеспечению
Глава 1 Взаимодействие компонентов приложения
Сигналы и приемники
Посылка сигналов
Реализация приемников
Реализация соединения
Обработка событий
Работа с окном
Работа с фокусом ввода
Работа с мышью
Работа с клавиатурой
Реализация перетаскивания
Фильтры событий
Синтетические события
Последовательность обработки событий
Заключение
Глава 2 Диалоговые окна и простейшие элементы управления
Создание диалогового приложения
Создание заготовки приложения
Создание заготовки диалогового окна
Завершение создания диалогового приложения
Создание специализированных диалоговых окон
Создание диалогового окна с вкладками
Создание мастера
Глава 3 Классы элементов управления
Класс списка
Классы линейного регулятора и линейного индикатора
Работа с датой и временем
Глава 4 Классы приложений, документов и представлений
Многооконное приложение Qt
Класс документа
Класс представления
Класс приложения
Многооконное приложение KDE
Класс документа
Класс представления
Класс приложения
Глава 5 Создание элементов пользовательского интерфейса
Пользовательский интерфейс библиотеки Qt
Внесение изменений в меню
Работа со строкой состояния
Пользовательский интерфейс приложений KDE
Внесение изменений в меню
Настройка панели инструментов
Работа со строкой состояния
Глава 6 Вывод информации на экран
Рисование фигур
Работа с кистью
Перерисовка окна
Синхронизация объектов представления
Вывод текста
Работа с битовыми образами
Алпаратно-зависимые битовые образы
Аппаратно-независимые битовые образы
Глава 1 Работа с файлами документов
Сохранение и восстановление информации в приложении
Настройка диалоговых окон
Внесение изменений в меню
Установка рабочего каталога
Глава 8 Работа с текстовыми документами
Создание простейшего текстового редактора
Создание более сложного редактора
Создание редактора KDE
Глава 9 Шаблоны и классы коллекций
Шаблоны
Понятие шаблона
Шаблоны функций
Шаблоны классов
Классы коллекций
Виды классов коллекций
Массивы
Связные списки
Карты отображений
Другие классы коллекций
Глава 10 Реализация многозадачности в приложении
Взаимодействие процессов
Создание клиента для простейшего сервера
Создание более сложного сервера
Создание клиента
Некоторые замечания
Глава 11 Справка в приложении
Формы представления справочной информации
Способы доступа к справочной системе
Способы представления справочной информации
Формы представления информации
Программирование контекстной справки
Вывод подсказок
Вывод справочной информации в строку состояния
Получение информации по конкретному элементу
пользовательского интерфейса
Программирование командной справки
Формат файлов командной справки приложений Qt
Создание демонстрационного приложения Qt
Приложение 1 Что на CD
Приложение 2 Ресурсы Интернета
Предметный указатель

Бесплатно скачать электронную книгу в удобном формате, смотреть и читать:
Скачать книгу Программирование на C++ в Linux - Николай Секунов - fileskachat.com, быстрое и бесплатное скачивание.

Скачать pdf
Ниже можно купить эту книгу по лучшей цене со скидкой с доставкой по всей России.