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