Энциклопедия мобильной связи

Программирование в линукс на си. Программирование на Си (C) в Ubuntu (Linux)

Песочница

Леонид Якубович 15 марта 2014 в 13:20

Обучение С++. Что если начать на Linux?

Накипело!

В нынешней системе школьного образования заточка под операционную систему Microsoft поражает: за очень редким исключением вы сможете где-нибудь увидеть что-то вроде Edubuntu или русский ALT Linux, но остальном это Windows. По моему мнению, давно пора еще в школах знакомить детей с другим взглядом на то, каким должен быть интерфейс между человеком и железом, а не искать общих путей. Может быть именно такой сравнительно-аналитический взгляд на вещи позволит поднять крайне низкий уровень компьютерной грамотности у выпускников школ, которые даже не могут оформить текст в Word или составить добротную презентацию в PowerPoint.

Искренне удивляет, что в школах считается сверхсложным и даже мистическим составлять двумерные массивы в том же Pascal"e, который к слову, тоже давным давно пора заменить на более гибкий и удобный Python или JavaScript. Уважаемые преподаватели, какой должна быть мотивация ученика, если его учат на мертвом языке? Мы же для закрепления правил грамматики не учим сперва славянский, а потом русский и другие. Так какого черта?!

Учитывая модность профессии программиста и определенную романтику в головах молодых людей, навеянную голливудским кино, люди поступают в ВУЗы и сталкиются с рядом сложностей: их голова начинает резко расширяться, что неминуемо приводит сперва к усталости, а затем и к разочарованию в своем выборе. Факт остается фактом: если вы связываете себя с профессией, которая требует постоянного самосовершенствования, то начинайте это делать еще до поступления. Есть множество материалов, который помогут вам быть более подготовленными в процессе учебы и позволит найти работу по специальности уже к 3-4 курсу обучения. Шевелитесь!

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

Начнем с того, что нам понадобится:
-Дистрибутив Linux (возьмем Ubuntu);
-Установленный компилятор g++;
-Обычный текстовый редактор (gedit);
-Терминал;

Поехали!

1. Установка Linux и необходимого софта.
Скачиваем с официального сайта ubuntu.ru образ дистрибутива Linux Ubuntu. Хотелось бы также добавить, что не рекомендую использовать Wubi. Делаем нормальную установку либо на наш жесткий диск, либо в виртуальной машине. Записываем с помощью Nero или ImgBurn образ на диск. Перезагружаемся и заходим в BIOS, где нам нужно выставить приоритет загрузки с CD/DVD - привода. Сохраняем настройки и выходим. Загружаемся с диска и устанавливаем операционную систему. (Более подробная информация будет в ссылке ниже). Текстовый редактор, терминал у нас есть по умолчанию. Для того, чтобы установить компилятор g++ открываем терминал с помощью комбинации alt+ctrl+T и вводим: sudo apt-get install g++ . Нас попросят ввести пароль, вводим, нажимаем Enter. Готово.
2. Создание cpp-файла.
Открываем домашнюю папку в файловом менеджере Nautilus и параллельно открываем терминал alt+ctrl+t. В нем пишем команду touch helloworld.cpp. Команда touch создаст файл с нужным вам названием. Теперь можно свернуть терминал и сфокусироваться на Nautilus"e. Открываем наш файл и пишем самый популярный в мире код:

#include using namespace std; int main(){ cout << "Hello world!"; return 0; }

Закрываем, сохраняем.

3.Компиляция и запуск.
Снова открываем терминал и вызываем наш компилятор командой g++ -lm -o output helloworld.cpp . g++ - собственно наш компилятор, а -lm и -o это параметры-ключи, с которыми мы его запускаем. output - имея файла вывода, куда помещается результат нашей компиляции и следом за ним имя нашего cpp-файла. Нажимаем enter, если программа верна, то никаких сообщений не будет. Теперь, чтобы запустить программу введем в терминале следующее: ./output и нажмем enter. На экране выведен результат «Hello world!».
Вот вы и написали свою первую программу на C++ для Linux! Поздравляю вас и желаю успехов в расностороннем и качественном обучении. Ваша компетентность в ваших руках, помните об этом.

P.S. Если хотя бы один школьник проделает то, что я написал, буду считать, что моя миссия выполнена. Всем добра!
P.S.S. Ссылки.

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

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

Данный мастер-класс предназначен для людей, которые хотят изучить API *nix подобных ОС, в частности под Linux. Здесь будут рассмотрены особенности разработки под ОС Linux, которые включают в себя:


  • Ознакомление с процессом сборки ПО и специфики компилятора C из состава GCC

  • Разработка и использование разделяемых библиотек

  • Отладка программ

  • Изучение механизмов низкоуровнего файлового ввода-вывода

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

  • Применение файловых и сетевых сокетов

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

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

  • Создание демонов, изучение различия между демонами и прикладным ПО

  • Изучение особенностей консольного ввода-вывода

  • Применение отображаемых в память файлов и их использование

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

Требования к участникам мастер-класса: Знание языка си, на уровне книги Б.В. Керниган,Д.М. Ричи "ЯЗЫК С".

Стоимость данного мастер-класса будет составлять 6 000 рублей.

Место проведения - город Москва, в помещении Хакспейса Нейрон.
Даты проведения: Ориентировочно 4 июля (понедельник), по 7 июля (четверг) с 10 до 17 с перерывом на обед и перерывами на чай/кофе.

Онлайн трансляции не планируется.
Количество человек в группе: 8-10.

Запись ведётся по электронной почте [email protected] либо в комментариях к этому посту. Для записи необходимо ваше Ф.И.О. (полностью) и контактные данные (номер телефона и почта). Желательно описать цели посещения этого мастер-класса, уровень подготовки и род занятий.

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

Модуль 1. Введение


  • Ознакомление со спецификой сборки ПО в GNU/Linux

  • Ознакомление с консольными текстовыми редакторами (vi,nano,mcedit)

  • Работа с отладчиком gdb

  • Ручная и автоматическая сборка ПО (Makefile)

  • Модель Клиент-Интерфейс-Сервер (КИС)

  • Статическая сборка библиотек

  • Совместно используемые библиотеки

  • Работа с переменными окружения

Модуль 2. Низкоуровневый ввод-вывод и файловые операции

  • Обзор механизмов ввода-вывода в Linux (Ubuntu)

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

  • Системные вызовы: open, close, write, read и lseek

  • Типы файлов

  • Индексные дескрипторы и жесткие ссылки

  • Права доступа к файлу

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

  • Два способа прочесть содержимое директории

  • Разреженные файлы и специфика их применения

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

Модуль 3. Межпроцессное взаимодействие

  • Механизмы межпроцессного взаимодействия Linux (Ubuntu)

  • Неименованные каналы (pipes)

  • Именованные каналы (named pipes)

  • Сообщения (message queue)

  • Разделяемая память (shared memory)

  • Семафоры (semaphores)

Модуль 4. Сокеты

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

  • Парные сокеты (pair sockets)

  • Сетевые сокеты (sockets)

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

  • Знакомство с сигналами (signals)

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

  • Специфика обработки сигналов (signal handling)

  • Модуль 6. Процессы

  • Клонирование процессов — fork()

  • Замена исполняемого процесса — exec()

  • Зомби (zombies) — причины возникновения и способы их устранения

Модуль 7. Потоки

  • Потоки и процессы

  • Специфика построения многопоточных приложений (multithreading)

  • Досрочное завершение потока

Модуль 8. Потоки (продолжение)

  • Создание обработчика завершения потока

  • Средства синхронизации потоков (synchronize primitives)

  • Атрибуты потоков

Модуль 9. Демоны (службы)

  • Отличие демона от консольной утилиты

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

  • Создание демона использующего сетевые сокеты

Модуль 10. Консольный ввод-вывод

  • Специфика разработки консольных приложений

  • Предотвращение перенаправления вывода

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

  • Сокрытие пароля пользователя при аутентификации

  • Управление терминалом с помощью ESC-последовательностей

Модуль 11. Отображаемая память

  • Отображение обычного файла

  • Совместный доступ к файлу

  • Частные отображения

  • Другие применения mmap

Модуль 12. Домашнее задание

  • Специфика разработки 64-битных приложений

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

Ведущий курса: Долин Сергей. Электронщик, разработчик ПО linux (прикладное, тестового ПО для железа, драйвера). Разработчик ПО для встраиваемых систем. Программист linux с 2011 года. Работал в ОАО "НИЦЭВТ", АО «Концерн «Системпром», ООО "ПРОСОФТ" (в дочерней компании "Доламант").

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

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

C не поддерживает объектно-ориентированного программирования. Поддержка ООП реализована в C++. Хотя последний возник на основе языка C, он не является его "продолжением", а представляет собой отдельный язык, который можно изучать, не зная C. Однако изучение C полезно перед знакомством с его "продвинутым младшим братом", т.к. синтаксис языков похож, C не перегружает мозг начинающего программиста сверхвозможностями и приучает к пониманию сути происходящего.

Подходит ли C для первого знакомства с программированием? Если вы не обучаетесь в вузе по специальности, связанной с IT, то нет. C предполагает понимание организации и принципов работы аппаратного обеспечения, в частности – памяти. Здесь многое делается с помощью указателей, они играют ключевую роль; эта тема достаточно сложная для понимания и обычно не изучается в школе.

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

Среды и компиляторы для программирования на C

Если вы пользуетесь одним из дистрибутивов GNU/Linux, вам подойдет любой текстовый редактор с подсветкой синтаксиса, также понадобятся GCC и терминал.

Существуют редакторы для программистов, включающие различные дополнения, в том числе терминал, просмотр каталогов и др. Например, Geany или Atom.

C – компилируемый язык программирования. В GNU/Linux для получения исполняемых файлов используется GCC – набор компиляторов, включающий в том числе компилятор для C. Чтобы из исходного файла (обычно таким файлам дают расширение *.с) получить исполняемый, надо выполнить в терминале команду примерно следующего вида:

gcc -o hello hello.c

Где gcc - команда, запускающая программу, выполняющую компиляцию и иные действия; -o – ключ, сообщающий, что мы вручную указываем имя исполняемого файла; hello – имя получаемого исполняемого файла; hello.c – имя файла с исходным кодом. Имя исполняемого файла можно не указывать:

gcc hello.c

В этом случае исполняемый файл будет иметь имя по умолчанию a.out.

Для Windows существует свой набор компиляторов – MinGW. Его можно использовать самостоятельно, однако он входит в состав простой среды разработки Dev-C++ , которая может оказаться хорошим выбором для обучения программированию на языках C и С++.

При сохранении выбирайте тип файла "C source files (*.c)". Компиляция и запуск программы выполняется при нажатии клавиши F9. После исполнения программа сразу закрывается и результат невозможно увидеть. Чтобы этого не происходило, прописывают две дополнительные строки: #include и getch(). (Возможно это не актуально для более новой версии Dev-C++.)

"Hello World" в GNU/Linux:

#include \n " ) ; }

"Hello World" в Windows:

#include #include int main () { printf ("Hello World\n " ) ; getch () ; }

С другой стороны, существует большое количество кроссплатформенных сред разработки. Например, Eclipse + модуль CDT, KDevelop, CLion. Последняя платна, выпускается компанией JetBrains – лидером в разработке IDE, однако имеет 30-ти дневный триальный период, чего может быть достаточно для обучения. CLion удобнее других IDE.

"Hello World" на C

На примере простейшей программы сразу отметим некоторые особенности языка программирования C.

В языке C роль основной ветки программы берет на себя функция main(). Эта функция всегда должна присутствовать в законченной программе на языке C, и исполнение программы начинается именно с нее. Однако объявленные внутри нее переменные не являются глобальными, их область видимости простирается только на main(). Тем не менее в языке программирования C почти весь программный код заключается в функции, и функция main() является главной и обязательной.

По умолчанию функция main() возвращает тип данных int, поэтому можно не указывать тип возвращаемых данных. Однако компилятор в этом случае выносит предупреждение.

Функция printf() предназначена для вывода данных. Ее назначение аналогично процедуре write() языка Pascal и функции print() в Python. Функция printf() после вывода не выполняет переход на новую строку. Поэтому для перехода используется специальный символ, который обозначается комбинацией \n. Законченные выражения на языке C разделяются точкой с запятой.

В языке C функции ввода-вывода не являются частью языка. Например, в Python нам не надо импортировать никакой модуль, чтобы пользоваться функциями print() и input(). В C же мы не можем просто вызвать функцию printf(), т.к. в самом C ее просто нет. Эту функцию, а также ряд других, можно подключить с помощью заголовочного файла stdio.h. Именно для этого в начале программы прописана строка #include . Include с английского переводится как "включить", а stdio есть сокращение от "стандартный ввод-вывод (input-output)".

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

Практическая работа

Закомментируйте 1 первую строчку кода программы HelloWorld. Попробуйте скомпилировать программу. Удалось ли получить исполняемый файл? Какое предупреждение выдал компилятор?

1 // - однострочный комментарий на языке C; /* … */ - многострочный комментарий на языке C.

Всем привет! Это первая статья о программировании на Си, в котором мы настроим тестовый редактор и узнаем немного о истории языка Си, возможностях, преимуществах и недостатках.

Языку Си в 2012 году исполнилось 40 лет. Си стал родоначальником C++, Java, Perl, C#, JavaScript и тд. Это самый популярный язык программирования в мире. Си процедурный язык программирования. Файлы кода имеют расширение.c а заголовочные файлы.h. На Си вы можете программировать для Linux, Windows, Windows Phone, Mac OS, iOS, Android и тд. Любой программист должен владеть языком программирования Си. Что бы стать программистом читать одних книг и статей мало. Нужно еще и практиковать. Поэтому мы рассмотрим наши уроки обязательно с примерами. Если у вас возникнет какие то вопросы, то можете задавать в комментариях. Так же этим мануалом могут пользоваться пользователи Windows и Mac OS. Пользователи других ОС могут пользоваться например NetBeans в качестве компилятора (NetBeans поддерживает не только Си но и Java, PHP, C++, Python и Ruby)

Настройка

Для программирования на понадобится текстовый редактор (gedit) и компилятор (gcc - входит в состав Ubuntu). Компилятор настраивать не нужно, а вот текстовый редактор настроим сейчас.

Откройте Правка -> Настройки . Установите галочки на следующие пункты:

  • Показывать номера строк;
  • Подсвечивать текущую строку;
  • Подсвечивать парные скобки;
  • Можно так же изменить тему в вкладке Шрифты и цвета.

Пара выполненных «махинаций» с gedit упростят на работу с текстовым редактором. А в дальнейшем мы рассмотрим какой-нибудь IDE (интегрирования среда разработки).

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

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

Исторически сложилось так, что ядро Unix было написано на языке Си. Даже более того, этот язык был создан для написания ядра Unix. Поскольку ядро Linux было основано на ядре Minix (версии Unix), то оно тоже было написано на Си. Поэтому можно сказать, что основной язык программирования для Linux это Си и С++. Такая тенденция сохранялась на протяжении долгого времени.

А вообще, писать программы для Linux можно почти на любом языке начиная от Java и Python и заканчивая С# и даже Pascal. Для всех языков есть компиляторы и интерпретаторы. Писать программы на С++ сложно, а Си многими уже считается устаревшим, поэтому множество программистов используют другие языки для написания программ. Например, множество системных инструментов написаны на Python или Perl. Большинство программ от команды Linux Mint, установщик Ubuntu и некоторые скрипты apt написаны на Python. Множество скриптов, в том числе простые скрипты оптимизации написаны на Perl. Иногда для скриптов используется Ruby. Это скрипты OpenShift или, например, фреймворк Metasploit. Некоторые разработчики кроссплатформенных программ используют Java. Но основные компоненты системы написаны все же на Си.

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

Зачем учить Си:

2. Библиотеки

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

Библиотеки делятся на два типа:

  • Статические - они связываются с программой на этапе компиляции, они связываются и после этого все функции библиотеки доступны в программе как родные. Такие библиотеки имеют расширение.a;
  • Динамические - такие библиотеки встречаются намного чаще, они загружены в оперативную память, и связываются с программной динамически. Когда программе нужна какая-либо библиотека, она просто вызывает ее по известному адресу в оперативной памяти. Это позволяет экономить память. Расширение этих библиотек - .so, которое походит от Shared Object.

Таким образом, для любой программы на Си нужно подключать библиотеки, и все программы используют какие-либо библиотеки. Также важно заметить, на каком языке бы вы не надумали писать, в конечном итоге все будет сведено к системным библиотекам Си. Например, вы пишите программу на Python, используете стандартные возможности этого языка, а сам интерпретатор уже является программой на Си/С++, которая использует системные библиотеки для доступа к основным возможностям. Поэтому важно понимать как работают программы на Си. Конечно, есть языки, вроде Go, которые сразу переводятся на ассемблер, но там используются принципы те же, что и здесь. К тому же системное программирование linux, в основном, это Си или С++.

3. Процесс сборки программы

Перед тем как мы перейдем к практике и создадим свою первую программу, нужно разобрать как происходит процесс сборки, из каких этапов он состоит.

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

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

Далее к работе приступает компоновщик. Его задача связать объектный модуль со статическими библиотеками и другими объектными модулями. Для каждого исходного файла создается отдельный объектный модуль. Только теперь программа может быть запущена.

А теперь, давайте рассмотрим весь єтот процесс на практике с использованием компилятора GCC.

4. Как собрать программу

Для сборки программ в Linux используется два типа компиляторов, это . Пока что GCC более распространен, поэтому рассматривать мы будем именно его. Обычно, программа уже установлена в вашей системе, если же нет, вы можете выполнить для установки в Ubuntu:

sudo apt install gcc

Перед тем как мы перейдем к написанию и сборке программы, давайте рассмотрим синтаксис и опции компилятора:

$ gcc опции исходный_файл_1.с -o готовый_файл

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

  • -o - записать результат в файл для вывода;
  • -c - создать объектный файл;
  • -x - указать тип файла;
  • -l - загрузить статическую библиотеку.

Собственно, это все самое основное, что нам понадобится. Теперь создадим нашу первую программу. Она будет выводить строку текста на экран и чтобы было интереснее, считать квадратный корень из числа 9. Вот исходный код:

include
#include

int main(){
printf("сайт\n");
printf("Корень: %f\n", sqrt(9));
return 0;
}

gcc -c program.c -o program.o

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

gcc -lm program.o -o program

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

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

Это две библиотеки загрузчика, стандартная libc и libm, которую мы подключили.

5. Автоматизация сборки

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

цель: зависимости
команда

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

program: program.o
gcc -lm program.o -o program

program.o: program.c
gcc -c program.c -o program.o

Затем вам достаточно выполнить команду make для запуска компиляции, только не забудьте удалить предыдущие временные файлы и собранную программу:

Программа снова готова и вы можете ее запустить.

Выводы

Создание программ Linux очень интересно и увлекательно. Вы сами убедитесь в этом, когда немного освоитесь в этом деле. Сложно охватить все в такой небольшой статье, но мы рассмотрели самые основы и они должны дать вам базу. В этой статье мы рассмотрели основы программирования в linux, если у вас остались вопросы, спрашивайте в комментариях!

Курс программирования на Си под Linux:



Понравилась статья? Поделитесь с друзьями!
Была ли эта статья полезной?
Да
Нет
Спасибо, за Ваш отзыв!
Что-то пошло не так и Ваш голос не был учтен.
Спасибо. Ваше сообщение отправлено
Нашли в тексте ошибку?
Выделите её, нажмите Ctrl + Enter и мы всё исправим!