Я решил написать эту статью, поскольку
я столкнулся при переходе с 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 и очень быстро.
Ну, хватит на сегодня.
Котельников Руслан.