Перейти к содержимому

Как написать программу под linux

  • автор:

Как написать и запустить программу на языке C в Linux

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

Для компиляции простой программы на языке C мы используем инструмент командной строки Linux — терминал. Чтобы открыть терминал, вы можете использовать Ubuntu Dash или комбинацию клавиш Ctrl+Alt+T.

Шаг 1: Установите необходимые для сборки пакеты

Для компиляции и выполнения программы на языке C необходимо, чтобы в вашей системе были установлены необходимые пакеты. Введите следующую команду от имени root в терминале Linux:

sudo apt-get install build-essential

Установка пакетов build-essential с помощью apt

Вам будет предложено ввести пароль для root; после этого начнется процесс установки. Пожалуйста, убедитесь, что вы подключены к интернету.

Шаг 2: Напишите простую программу на языке C

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

nano sampleProgram.c

Откройте графический текстовый редактор Ubuntu и напишите или скопируйте в него следующий пример программы:

#include int main()

Затем сохраните файл. В этом примере я назвал свою программу на языке Си как sampleProgram.c

Пример программы на Си

Шаг 3: Скомпилируйте программу на языке C с помощью компилятора gcc

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

gcc [ИмяФайла].c -o [ИмяПрограммы]
gcc sampleProgram.c -o sampleProgram

Шаг 4: Запуск программы

Последний шаг — запуск скомпилированной программы на языке C. Для этого используйте следующий синтаксис:

./Имя программы
./sampleProgram

Запуск нашей скомпилированной программы

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

Из этой статьи вы узнали, как написать, скомпилировать и запустить простую программу на языке C в Linux.

Как написать программу под linux

В прошлой теме было рассмотрено создание первой программы на Windows. Теперь рассмотрим создание первой программы на Linux, в частности, в среде Ubuntu 16.04. На Linux также популярным компилятор для создания программ является g++. Поэтому в данном случае также будем использовать этот компилятор.

Как правило, многие дистрибутивы Linux, в том числе и Ubuntu, уже по умолчанию содержат установленный компилятор g++, который мы сразу же можем использовать. Но даже если вдруг он не установлен, то его можно доустановить в терминале через команду:

sudo apt-get install g++

В остальном, если мы будем использовать для компиляции компилятор g++, все будет аналогично созданию программы на Windows.

Определим в файловой системе каталог для исходных файлов с кодом на С++ и создадим в нем новый файл hello.cpp со следующим кодом:

#include // подключаем заголовочный файл iostream int main() // определяем функцию main < // начало функции std::cout // конец функции

И это тот же код, что был в случае с Windows, потому что программы на С++ на уровне исходного кода в большей степени обладают переносимостью.

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

#include

Данная строка представляет директиву препроцессора, которая позволяет подключить библиотеку iostream. Эта библиотека нужна для вывода строки на консоль.

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

Функция main состоит из четырех элементов:

  • Тип возвращаемого значения . В данном случае это тип int . Этот тип указывает, что функция должна возвращать целое число.
  • Имя функции . В данном случае функция называется main.
  • Список параметров . После имени функции в скобках идет список параметров. Но в данном случае скобки пустые, то есть функция main не принимает параметров.
  • Тело функции . После списка параметров в фигурных скобках идет тело функции. Здесь и определяются собственно те действия, которые выполняет функция main.

В функции осуществляем выход из функции с помощью оператора return . Так как функция должна возвращать целое число, то после return указывается число 0. Ноль используется в качестве индикатора успешного завершения программы.

После каждой инструкции в языке C++ ставятся точка с запятой.

Первая программа на C++ на Linux

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

Далее для компиляции программы введем команду:

g++ hello.cpp -o hello

Кроме имени файла с исходным кодом компилятору передается параметр -o hello . Он указывает, что мы хотим скомпилировать файл по имени hello. Если этот параметр не передать, то будет создан файл с именем по умолчанию - a.out.

В итоге после выполнения выше приведенной команды в папке с файлом hello.cpp появится скомпилированный файл, который будет называться hello . И мы сможем его запустить с помощью следующей команды:

./hello

И на консоль будет выведена строка "Hello World!".

Руководство по написанию скриптов в Linux Bash

Рассказываем, как писать программы на bash с помощью циклов, переменных, управляющих конструкций и аргументов.

Введение

Набор встроенных команд bash (и его аналогов sh, zsh, etc) совместим с любым POSIX-совместимым приложением в Linux, что позволяет встроить в ваш bash-скрипт любое совместимое приложение. Это дает очень большой набор возможностей в сфере автоматизации рутинных задач администрирования систем Linux, деплоя и сборки приложений, различных пакетных обработок, в том числе аудио и видео.

Командная строка — самый мощный пользовательский интерфейс из существующих на данный момент. Базовый уровень знаний получить достаточно просто. Рекомендуется изучить руководство bash. Это можно сделать, выполнив команду man bash.

Суть bash-скриптов — записать все ваши действия в один файл и выполнять их по необходимости.

В этой статье расскажем про написание bash-скриптов с нуля и получим представление, какую пользу можно из них извлечь. Рекомендуем держать под рукой bash-справочник, если вы планируете заняться этим всерьез.

Развертывание среды

Для выполнения скриптов, которые мы будем учиться писать, нужна среда. Если вы используете на своем компьютере систему Linux, вы можете делать все локально. Если Windows, — можете установить WSL/WSL2. Кроме того, вы можете создать виртуальный сервер и подключиться к нему по SSH. Так вы не навредите своему компьютеру если что-то пойдет не так.

Мы выбрали вариант создать виртуальную машину. Залогинимся в личном кабинете https://my.selectel.ru/, нажав на вкладку «Облачная платформа». Там вы сможете создать виртуальный сервер.

Необходимо выбрать зону размещения сервера исходя из его близости к пользователям. Чем дальше сервер, тем выше пинг.

Нажмем Создать сервер.

В разделе Источник убеждаемся, что выбран образ Ubuntu 20.04.

Конфигурацию можно настроить по своим потребностям.

В разделе «Сеть» стоит выбрать «Подсеть — Плавающий IP-адрес».

В разделе «Доступ» загрузите SSH-ключ и не забудьте сохранить root-пароль. Подробнее об этом рассказано в этой статье

Теперь можно создать сервер кнопкой «Создать» в самом низу.

Будет отображена страница статуса сервера, надо дождаться индикации ACTIVE вверху справа.

Теперь на вкладке «Порты» можно посмотреть IP-адрес, присвоенный серверу.

Не копируйте чужой код

Копирование чужого кода на свой компьютер/сервер опасно. Ранее существовал «патч Бармина», представляющий из себя команду rm -rf /*. Ее очень любили давать новичкам Linux на некоторых конференциях в качестве универсального средства от всех проблем. Суть команды — рекурсивное удаление всех каталогов внутри корневого каталога, т. е. всех системных и пользовательских файлов. Сейчас эта команда не сработает во всех актуальных версиях Linux, но раньше она служила злой шуткой и наказанием тем, кто копировал чужие скрипты на свои серверы и выполнял их. Способов навредить серверу/компьютеру все еще достаточно, но они не столь очевидны.

Выбор редактора

Вам потребуется удобный текстовый редактор. Если вы подключаетесь по SSH, то лучшим выбором будут 3 варианта:

  • * vim (если умеете из него выходить)
  • * nano (прост, удобен и надежен)
  • * mcedit (входит в пакет mc, классический двухпанельный консольный файловый менеджер)

Если вы делаете все локально, выбор полностью на вас. Обычный выбор под Linux — gedit. В этой инструкции мы пользовались nano через SSH на удаленном сервере.

Запуск “Hello, World!”

Первая программа, которую обычно пишут программисты это «Hello, World!» — простой вывод этой строки. Мы тоже с этого начнем. За вывод строки в консоль отвечает команда echo. Прямо в консоли вы можете напечатать echo «Hello, World!» и получить соответствующий вывод:

root@geneviev:~ # echo "Hello, World!" Hello, World! 

Сделаем это программой. Команда touch helloworld.sh создаст файл helloworld.sh. Команда nano helloworld.sh откроет этот файл для редактирования. Заполним файл нашей программой:

#!/bin/bash echo "Hello, World!" 

Для выхода с сохранением из nano надо нажать CTRL + O для сохранения (после чего нажать enter для перезаписи текущего открытого файла), а потом CTRL + X для выхода. Можно выходить без сохранения, при этом он спросит, точно ли вы хотите выйти без сохранения. Если да, надо нажать N для выхода без сохранения. Если вы нажмете Y, он спросит куда сохранить измененный файл, можно нажать enter для перезаписи редактируемого файла.

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

Первой строкой идет #!/bin/bash — фактически это указание на местоположение интерпретатора. Чтобы при запуске скрипта не требовалось указывать отдельно интерпретатор. Убедиться, что ваш bash интерпретатор лежит по этому пути можно через команду which bash:

root@geneviev:~ # which bash /usr/bin/bash 

Второй строкой идет непосредственно вся наша программа. Как она работает, мы разобрали выше, перейдем к выполнению.

Запустить ваш скрипт/команду можно двумя способами.

Способ №1: bash helloworld.sh. Вы вызываете интерпретатор и в аргументе передаете ему имя файла для исполнения.

root@geneviev:~ # bash helloworld.sh Hello, World! 

Способ №2: Сначала надо разрешить системе исполнять скрипт: chmod +x helloworld.sh. Эта команда сделает файл исполняемым. Теперь вы можете запустить его как любой бинарный файл в linux: ./helloworld.sh.

root@geneviev:~ # ./helloworld.sh Hello, World! 

Первая программа готова, она просто выводит строку в консоль.

Аргументы

Это параметры, которые вы можете передать программе при ее вызове. Например, программа ping принимает в качестве обязательного аргумента IP-адрес или DNS-имя, которое требуется пропинговать: ping selectel.ru. Это простой и удобный способ общения пользователя с программой.

Давайте научим нашу программу принимать аргументы и работать с ними. Доступ к аргументам осуществляется через служебную команду $X где X это число. $0 — всегда имя исполняемого скрипта. $1 — первый аргумент, $2 — второй и так далее. Конечно, если вы планируете передавать пару десятков аргументов вашему приложению, это может быть несколько утомительно, так что вам понадобится что-то вроде этого цикла, чтобы перебрать все поступившие аргументы:

for var in "$@"; do echo "$var" done 

Подробнее про циклы будет рассказано в следующих разделах.

Пример, создадим новый файл: touch hellousername.sh. Выдаем права на исполнение chmod +x hellousername.sh.

Открываем nano hellousername.sh

Код примера следующий:

#!/bin/bash echo "Hello, $1!" 

Сохраняем, закрываем. Смотрим, что получилось.

root@geneviev:~ # ./hellousername.sh Vasya Hello, Vasya! 

Программа получилась маленькая, но она учит пользоваться (на самом базовом уровне) аргументами, которые мы в нее можем передать. В данном случае аргумент передается один, Vasya, мы сразу его используем, не делая никаких проверок.

root@geneviev:~ # ./hellousername.sh Hello, ! 

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

Способ №1

#!/bin/bash if [ "$#" -lt 1 ]; then echo "Недостаточно аргументов. Пожалуйста, передайте в качестве аргумента имя. Пример: $0 Vasya" exit 1 fi echo "Hello, $1!" 

Более подробно конструкцию if then [else] fi мы рассмотрим далее, пока не будем на ней останавливаться. Важно понимать, что тут проверяется. $# Это число аргументов без учета имени скрипта, который всегда $0.

Способ №2

#!/bin/bash if [ -z "$1" ]; then echo "Имя пустое или не передано. Пожалуйста, передайте в качестве аргумента имя. Пример: $0 Vasya" exit 1 fi echo "Hello, $1!" 

Здесь тоже используется конструкция if then [else] fi. Ключ -z в if используется для проверки переменной на пустую строку. Есть противоположный ключ -n, он проверяет что строка не пустая. Конечно, этот способ некорректно использовать для проверки входящих аргументов, но в теле самой программы он будет полезен. Например, чтобы проверить что выполненное в самой программе приложение что-то вернуло.

Управляющие конструкции

if-else

Написание программ на любом из языков длиннее нескольких строчек сложно представить без ветвления. В разных языках бывают разные варианты ветвления, но в большинстве случаев используется синтаксис if else. В bash это также присутствует.

Возьмем один из примеров выше.

#!/bin/bash if [ "$#" -lt 1 ]; then echo "Недостаточно аргументов. Пожалуйста, передайте в качестве аргумента имя. Пример: $0 Vasya" exit 1 fi echo "Hello, $1!" 

Происходит проверка системной переменной $# на то, что она меньше, чем (lower than, -lt) 1. Если это выражение истинно, мы переходим в блок команд, открывающийся ключевым словом then. Весь блок, начинающийся с if, должен завершаться ключевым словом fi. Более сложная структура ветвления может выглядеть примерно так:

if TEST-COMMAND1 then STATEMENTS1 elif TEST-COMMAND2 then STATEMENTS2 else STATEMENTS3 fi 
#!/bin/bash if [ "$#" -lt 1 ]; then echo "Недостаточно аргументов. Пожалуйста, передайте в качестве аргумента имя. Пример: $0 Vasya" exit 1 fi if [ "$1" = "Vasya" ]; then echo "Whatsupp, Vasiliy?" elif [ "$1" = "Masha" ]; then echo "Hey, Masha" elif [ "$1" = "Michael" ]; then echo "Shalom, Michael" else echo "Hi, $1" fi 
root@geneviev:~ # ./hellousername.sh Vasya Whatsupp, Vasiliy? root@geneviev:~ # ./hellousername.sh Masha Hey, Masha root@geneviev:~ # ./hellousername.sh Michael Shalom, Michael root@geneviev:~ # ./hellousername.sh Andrew Hi, Andrew root@geneviev:~ # ./hellousername.sh Недостаточно аргументов. Пожалуйста, передайте в качестве аргумента имя. Пример: ./hellousername.sh Vasya 

Выражение «$1» = «Vasya» проверяет строки на идентичность. Блок после else выполняется только если выше не найден более подходящий блок.

&& и ||

В предыдущей главе вы могли заметить, что я использовал exit 1 для завершения работы программы в случае неуспешной проверки аргумента. Это означает, что программа завершилась с ошибкой. В bash есть операторы && и ||, которые используются для создания цепочек команд. Каждая цепочка зависит от результата выполнения предыдущей программы.

Пример 1: command1 && command2. В этом случае command2 выполнится, только если command1 завершится с кодом 0 (exit 0, по умолчанию).

Пример 2: command1 || command2. В этом случае command2 выполнится, только если command1 завершится с кодом отличным от 0.

Пример 3: command1 && command2 || command3. Если command1 завершится с кодом 0, то будет выполнен command2, иначе command3.

Переменные

Как гласит один из основных принципов программирования — Do Not Repeat Yourself (DRY). Вот и мы не будем повторять себя и перепишем предыдущий пример с использованием переменных, чтобы не вызывать echo каждый раз.

Переменные в bash создаются присваиванием: x=»foo bar» или z=$1. Переменной x мы присвоили строку @foo bar«, а переменной z мы присвоили значение первого аргумента. Использовать именованные переменные гораздо удобнее, чем использовать $1, особенно когда надо использовать его значение во многих местах.

К тому же, аргументы могут идти в разном порядке. Осмысленные названия переменных очень важны, при разрастании программы это снизит неизбежную путаницу. Избегайте имен переменных (и функций) вроде «a», «b», «zzzz», etc.

Чтобы не вызывать echo в каждом варианте с разными строками, разобьем строку на части. Первая часть будет приветствием. Вторая — именем. Третья — завершающим знаком препинания. Его можно не выносить в переменную.

#!/bin/bash greetString="Hello" nameString="stranger" if [ "$#" -lt 1 ]; then echo "Недостаточно аргументов. Пожалуйста, передайте в качестве аргумента имя. Пример: $0 Vasya" exit 1 fi if [ "$1" = "Vasya" ]; then nameString="Vasiliy" greetString="Whatsup" elif [ "$1" = "Masha" ]; then nameString="Maria" elif [ "$1" = "Michael" ]; then greetString="Shalom" nameString="Michael" fi echo "$greetString, $nameString!" 

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

Как написать программу под linux

Предполагается, что читатель этой книги должен иметь хотя бы начальные пользовательские навыки при работе с GNU/Linux (умение вводить команды в оболочку и знать основы операционной системы), а также знать язык C хотя бы на начальном уровне. Я посчитал бессмысленным писать еще одну книгу по языку C. Если вы знаете язык C на уровне книги Кернигана и Ритчи "Язык программирования Си", то у вас не будет проблем с изучением материала этой книги.

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

Большая часть материала этой книги относится и к другим современным Unix-подобным операционным системам (FreeBSD, например). Если вы еще не знаете Linux, то больших проблем не будет.

1.2. Условные обозначения

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

 #include int main (void) 

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

 $ gcc gcc: no input files $ 

Примеры команд, вводимых от имени суперпользователя (root) выделяются так же, как и обычные команды, только в качестве приглашения командной строки используется символ #

 # lilo -t Added Linux * Added BootFromCD The boot sector and the map file have *NOT* been altered. # 

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

1.3. Что нужно иметь

То, что нам нужно иметь, называют инструментарием. Инструментарий программиста зависит от того, какие программы и на каких языках он будет писать. Наш инструментарий будет состоять из: 1) Операционной системы Linux (GNU/Linux) с текстовым редактором; 2) Компилятора с линковщиком; 3) Дополнительных утилит. Ну и конечно же из терпения и усердия.

Для начала нужно иметь Linux (здесь правильнее будет сказать GNU/Linux). Подойдет практически любой современный дистрибутив. Посмотрите, какая версия ядра Linux у вас используется. Наберите в оболочке следующую команду:

 $ uname -r 2.6.10nn1 $ 

У меня ядро версии 2.6.10. У вас, скорее всего, будет что-то другое. Дистрибутивы, построенные на ядрах версий 2.4.x и 2.6.x достаточно современные для того, чтобы воспроизвести все примеры в этой книге. Версии 2.0.x и 2.2.x также могут использоваться, но некоторые возможности, описанные в этой книге в этих ядрах не реализованы.

Следующий шаг - компилятор. Мы будем использовать компилятор gcc (не обсуждается!). Практически все дистрибутивы Linux поставляются вместе с компилятором языка C. Вопросы о том, какие программы установлены, как устанавливать недостающие программы выходят за рамки этой книги. Поэтому не буду объяснять, как проверить присутствие в системе компилятора. На начальном этапе обучения версия компилятора не имеет значения. Если у вас есть компилятор gcc, то и линковщик (о том, что это такое, будет рассказано позже) тоже есть (вероятность 99%).

Многие программисты используют различные оболочки для программирования (KDevelop, Glade и прочие). Мы откажемся от этого подхода по двум причинам: 1) это претит идеологии Unix; 2) за всеми этими средами разработки стоят те самые утилиты, которые мы будем использовать непосредственно. Нам на начальном этапе потребуется лишь утилита make.

И, наконец, немаловажная деталь. Текстовый редактор. Здесь на вкус и цвет товарища нет. В мире Unix-систем есть два лагеря: любители Vi и любители Emacs. В настоящее время написано много клонов редактора Vi (Vim, Elvis, GVim) и много клонов (а точнее - расширений) редактора Emacs. И для Vi и для Emacs существуют как консольные так и графические версии. Нет смысла обсуждать преимущества и недостатки этих двух "гигантов". Вам придется самостоятельно выбрать наиболее удобный для вас текстовый редактор. Возможно вам не понравится ни один из них и вы будете использовать что-нибудь наподобие kate или nedit или pico. Между прочим, редактор Pico открывает свой третий лагерь поклонников. Этот редактор, изначально разработанный в Вашингтонском университете для почтовика pine, а затем ставший самостоятельным редактором, уверенно набирает силу в сообществе Unix. Если вы полный аскет, можете попробовать редактор ed (red), который мало напоминает текстовый редактор в современном понимании. Опять же повторюсь, выбор за вами. Я использую консольную версию редактора Vim, но с большим уважением отношусь и к Emacs. Очень важно попробовать оба редактора "в полную силу", а не просто "взглянуть". Только опытный пользователь сможет за видимой неуклюжестью ощутить мощь и удобство. Это одна из важнейших граней идеологии Unix.

Подавляющую часть работы мы будем проводить в командной строке. "Командная строка" - общий термин, подразумевающий собой сочетание терминальной программы и командной оболочки. Терминальная программа (или программа эмуляции терминала), это то, что вы видите на экране, когда работаете с командной строкой. Терминальная программа позволяет пользователю вводить команды и видеть результаты их выполнения. Программа konsole в KDE, например, является терминальной программой. Под терминальной программой запускается командная оболочка (командный интерпретатор или просто shell). Командная оболочка через интерфейс терминальной программы общается с пользователем и выполняет всю основную работу. Bash, Csh, Ksh - это все командные оболочки или, как их еще называют, командные интерпретаторы. В Linux я рекомендую использовать оболочку Bash (Bourne Again SHell). Однако не произойдет ничего страшного, если вы будете использовать другую командную оболочку, например C-Shell (csh), у которой достаточно своих поклонников. Как вы позже узнаете, любая командная оболочка - это не просто исполнитель команд, но и полноценный интерпретатор собственного языка программирования. Чтобы узнать, какая оболочка запущена под терминальной программой, просто наберите команду ps. В одной из строк (скорее всего - в первой) будет написана ваша командная оболочка:

 $ ps PID TTY TIME CMD 5003 pts/0 00:00:00 bash 6025 pts/0 00:00:00 ps $ 

В моем случае это bash.

1.4. Обратная связь

Книга распространяется на условиях GNU Free Documentation License. В соответствии с условиями этой лицензии вы можете свободно скачивать и распространять книгу без каких-либо разрешений, но не нарушая и не изменяя условий Лицензии. Если вы хотите поместить копию книги на своем Интернет-ресурсе или просто распечатать - делайте это свободно, как завещал великий Столлман!

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *