Начало программирования в Linux

Котельников Руслан, 21.02.03.

Я решил написать эту статью, поскольку я столкнулся при переходе с Windows на Linux с тем, что способы программирования в Linux значительно отличаются от традиционного Windows. Поначалу это было очень страшно. Тем более, что во всех форумах пишут, что для программирования в Linux можно использовать только vim и gcc, а для отладки - gdb. Безусловно, с помощью этих программ и создают программы в Linux, но для новичка это не самый лучший способ - тем более, для программистов, пришедших из мира Windows. В Windows все программирование сводится к тому, что необходимо вначале создать форму(окно), вставить в форму несколько управляющих элементов и в сообщениях от них вставить код самой программы, или при многозадачности вставить запуск нового потока. Все это можно и даже еще проще сделать и под Linux. Единственное, в чем здесь отличия, что в Linux это - не основной способ программирования. Но если вам надо срочно написать программу под Linux и вам не очень хочется изучать способы программирования в Linux и идеологию этой OS, то для этой цели можно использовать KDevelop или же kate и Qt Designer. О том, как это делается, вы можете прочитать здесь: /usr/share/doc/qt-devel-xxxx или в интернете: хорошая подробная статья о Qt "Создание GUI в Linux" на сайте Softerra.ru. Так же есть книга "KDevelop. Руководство программиста".

Ну хватит о програмировании в графических системах, тем более что разных библиотек под Linux очень много (Qt, Gtk, ...).
Традиционно в Linux пишут программы на различных языках программирования. Если есть возможность написать что то на Perl, зачем применять c/c++. Если же вам надо в программе использовать, скажем, кодер mpg3 или же ogg - зачем самому писать код кодировщика или декодера, если есть lame и mencoder которые прекрасно работают. Тем более, управлять данными программами из своих элементарно, а главное - как просто написать, например, видео редактор.
Система Linux построена на основе идеологии Unix, поэтому для того, чтобы работать с каким либо устройством, вам просто необходимо читать и писать данные в один из файлов в каталоге /dev, например

cat /dev/audio > ~/data.au

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

 #include < stdio.h >
 #include < stdlib.h >

 int main()
 {
        FILE *r = fopen("/dev/audio", "rb");
        FILE *w = fopen("~/data.au", "wb");
        while(true) // Условие заканчивающее запись
        {
                fputc(fgetc(f), w);
        }
        fclose(w);
        fclose(r);
        return 0;
 }

Но возникает вопрос, а как с условием, ведь если там стоит true, то завершить программу можно только нажатием Ctrl+C и при этом не будут закрыты файлы. Как одновременно сделать так, что бы при этом файлы все-таки закрывались? Для этого необходимо запустить еще один процесс или поток - сейчас в Linux все возможно. Для этого используется системный вызов fork(). Определение его хранится в файле unistd.h. Вот как выглядит разветвление программы:

 #include < unistd.h>
 #include < stdio.h>

 int main()
 {
        int pid = fork();
        if(pid == 0)
        {
                printf("child process
");
        }
        else
        {
                printf("parent process
");
        }
        return 0;
 }

 
Теперь вопрос - как заставить взаимодействовать, ведь программа запускает два разных процесса. Здесь есть множество путей решения: сигналы, семофоры, каналы, ...
Подробней о этом всем написано в LPG. Если я здесь это начну описывать, то получится копирование одного и того же, к тому же LPG переведен на русский язык.
Если вы еще не освоились с Linux, то еще один пример - помните, как нам приходилось в Windows для поиска какого то файла на диске (поиск установленной программы, например) писать рекурсивный поиск. В Linux это, конечно, тоже можно, но зачем, ведь можно написать:

ls -R|grep [имя файла]

А как насчет того, чтобы обнаружить присутствие программы в памяти:

ps -x|grep [имя программы]

при этом grep использует регулярные выражения и вы можете искать данные по шаблону. Вы скажете, что это не c/c++, но в с есть вызов system(), execv(), ...

Обычно в Linux сначала пишут консольную версию программы - например, wget, gpg, ... а затем пишут графическую оболочку к данным программам. И у вас всегда есть выбор - использовать ли данную программу для своих нужд. Например, для шифрования можно использовать уже разработанный и отлаженный PGP, а для закачки файла из интернет - wget. В Linux в основном вся графика сохраняется в файлах формата png, jpeg. Самое прекрасное, что вы можете работать с файлами, скажем, по привычке в формате bmp, а затем с помощью посторонней программы сжать их в jpeg или распаковать. Пишу я эту статью в Quanta - очень удобно и практично, можно делать практически все что угодно на html и очень быстро.

Ну, хватит на сегодня.
Котельников Руслан.





Источник - LinuxBegin.ru
http://linuxbegin.ru

Адрес этой статьи:
http://linuxshop.ru/linuxbegin/article199.html