| RSS



Меню

Bookmark and Share


Статистика
Ваш IP: 216.73.216.185
Вы используете: v





Сейчас на сайте:

Тех поддержка ->

Облако тэгов
Брутер для мыла ОС видио сторона Tor Обратная антенна Направляющяя Strace php эксплоит Windows Server 2008 PPTP QIP Virtual proc kernel Tune sysctl freeBSD Qemu LiveCD Boot GEO Bluetooth game Video emulator Shell Python спама червь Conficker вирус троян лаборатория касперского пиратство Apple iPhone Microsoft twitter социальная сеть анонимность лицензия Open Source уязвимость MySQL база данных Закон Франция Пират Skype мобильный Deutsche Telekom хакер trend micro кибератака Германия робот искусственный интеллект Персональные данные Ноутбук Интернет китай цензура windows vista acer Linux патент браузер Firefox Internet Explorer Opera Safari Intel патч Oracle Банкомат IBM США Dell контроль кибербезопасность приговор Mozilla Chrome безопасность Госдума СМИ Windows 8 взлом Пентагон Украина Facebook Cisco Windows XP нетбук торрент музыка Биометрический Nokia ФБР IP-адрес sms RSA java Google Captcha Symantec Спам подросток Антивирус тест Windows 7 операционная система windows провайдер авторское право rapidshare UNIX свиной грипп шантаж Дети копирайт McAfee HTTPS icann студент WebMoney Норвегия New York Times YouTube Warner Music КНДР БД Ubuntu касперский Россия РФ сервер хостинг Wi-Fi суд пароль блог ПОЛЬША фишинг одноклассники Медведев контрафакт мошенник sony warner Gps по JavaScript Хакеры Yahoo фас компьютер софт американские военные Минкомсвязи праздник Сбой Toshiba мошенничество Доктор ВЕб Вконтакте Террорист исходный код МВД фильтр порнография свобода слова казахстан сисадмин Autodesk Gmail кредитная карта LiveJournal шифрование банк Нанотехнологии wikipedia выборы DNS Android атака Mac OS X клик домен ФСБ прокуратура уголовное дело ICQ Sophos ошибка военные DARPA сайт Онлайн игра турция конференция спамер Полиция Koobface Великобритания модем белоруссия Грузия Bittorrent Европа Dr.WEB Билл Гейтс спецслужбы ес Royal Bank of Scotland смартфон F-Secure Symbian фильм ГАИ Ватикан Новая Зеландия Adobe Австралия госуслуги IDC новости Internet Explorer 9 iPad Ирландия поиск МТС Реклама слежка испания патриотизм Office 2010 Zeus личные данные eset защита виртуализация OpenOffice.org Черный список BlackBerry льготы индия Москва Голосование социальные сети flash player paypal BitDefender сертификат налог Anonymous технологии OpenOffice Ассанж Северная Корея Оптоволокно передача данных ГОСТ арест nissan Samsung Иск конкуренция учетная запись исследование Cert счетчик Санкт-Петербург SOPA PIPA NASA кража Азербайджан Megaupload Мобильный телефон NTFS hotfile отчет почта России RIM приложение технология Инвестиции платформа отключение Valve DRM товарный знак DDoS-атака роскомнадзор оон sea

Главная » Статьи » Общие Статьи

Сygwin
Cygwin - это аббревиатура от 'Cygnus', группы разработчиков свободного ПО в рамках проекта 'RedHat' и 'Windows', всеми нами любимой операционной системы. Спешу развеять очень популярную точку зрения, будто бы cygwin - это эмулятор UNIX под Windows: это не так! Cygwin - это лишь мощный, очень развитый и, самое главное, бесплатный набор программных средств переноса (портирования) UNIX'ового ПО под Windows и кросс-компиляции (создания бинарного кода на одной платформе под другую) UNIX'овго софта. Лично для меня, cygwin, прежде всего, это мощнейший компилятор gcc с отшлифованными под Windows хидерами и либами.

Cygwin нынче становится весьма популярным: многие производители свободного ПО под UNIX поддерживать '--target=cygwin' в конфигах своих программ, благо, это не столь трудоёмко. А cygwin, в свою очередь, расширяет совместимость с UNIX, поддерживая не только posix, но и другие, более узкоспецифичные стандарты UNIX-систем.

Cygwin: где смотреть?

http://www.cygwin.com - официальная страница cygwin'а, на которой Вы сможете найти достаточное количество информации о текущем состоянии проекта, об обновлениях cygwin'овских релизов, а также официальный список ftp-серверов, периодично зеркалящих cygwin.

Cygwin: что и как устанавливать?

На Хакере уже несколько раз писали про установку и использование Cygwin, поэтому рекомендую вам обратится к тем статьям:
CYGWIN - *nix в ваших Виндах
Особенности настройки Cygwin

gcc: какой он?

Точно такой же, как и в UNIX. Сочный, мощный, безглючный. Однако, не такой быстрый. Дело в том, что запуск препроцессора, компилятора, ассемблера и линковщика требует определённого времени на загрузку и пролинковку в памяти библиотеки cygwin1.dll, требумую каждым из этих компонентов gcc. Отмечу, что в Windows 2000 это требует на порядок меньше времени, чем в Windows 98. Скорость компиляции в Windows 2000 очень близка к скорости компиляции в UNIX. Но сок остаётся соком: генерируемый бинарный код cygwin'ным gcc остаётся вне конкуренции по компактности и эффективности!

Если Вы когда-либо писали или компилировали программы под UNIX, Вы не будете испытывать никаких трудностей в работе с cygwin. Только помните, что cygwin'ный gcc может не поддерживать некоторые опции, которыми Вы пользуетесь в UNIX'е, хотя количество таких недоразумений сведено к минимуму. На моём веку, например, таких проблем не возникало. В любом случае, если возникают какие-то проблемы, все мы дружно знаем лучший способ их решения: 'man gcc'! :)))

Если же Вам не доводилось прежде заниматься программированием под UNIX и Вы привыкли жать <F9> для того, чтобы скомпилировать Вашу программу, расстраиваться не стоит. Попробуйте 'man gcc' в bash'е cygwin'а: вполне достойное и увлекательное чтиво.

Таки начнём?

Оригинальничать я не буду, поэтому начнём мы, как всегда и везде, с вывода 'hello world!' на консоль. Итак, hello.c:

#include <stdio.h>
int main () {
printf("Hello World!\n");
return 0;
}


Компилируем:

gcc -s hello.c -o hello.exe

и смотрим на бинарник. 3072 байта бинарного кода, формат PE, portable executable, загружаемые dll:

cygwin1.dll, откуда hello.exe берёт нашу printf() и другие функции, которые накомпилировал нам gcc;
kernel32.dll, откуда hello.exe берёт GetModuleHandleA.

Хидер <stdio.h> gcc берёт из /usr/include, который является дефолтной инклудной директорией и в UNIX, и в cygwin'е.

В cygwin'ном gcc есть одна очень приятная опция, которая, почему-то, не задокументирована в man-файле, '-mno-cygwin'. Скомпилируем нашу программу с этой опцией:

gcc -mno-cygwin -s hello.c -o hello.exe

и смотрим на бинарник: опять, 3072 байта бинарного кода, но наша программа больше не нуждается в cygwin1.dll! вместо этого она использует msvcrt.dll, где и находит нужную нам функцию printf.

Если мы юзаем опцию '-mno-cygwin', cygwin кидает gcc'шный препроцессор в директорию /usr/include/mingw, и, соответственно, gcc компилирует <stdio.h> именно из этой директории.

Настоятельно рекомендую совершить прогулку по содержимому директории /usr/include для того, чтобы понять, что к чему. Думаю, Вас особо порадует содержимое директорий /usr/include/sys и /usr/include/w32api.

Таким образом, cygwin находит компромисс между двумя противоречащими друг с другом платформами, UNIX и Windows и даёт нам уникальный шанс изучать программирование под UNIX, не покидая Windows. Далее следует пример простенькой программки, компилирующейся и под posix'овые BSD Sockets, и под WinSock2. Программка открывает указанный в командной строчке порт и ожидает tcp-соединение с любого IP-адреса, принимает от клиента литеру и возвращает клиенту эту же литеру, увеличенную на единицу. Вы можете скомпилировать эту программку, запустить её ('easy.exe 500'), приконнектиться к ней телнетом ('telnet 127.0.0.1 500') и ввести любой символ.

---[ Makefile (для неюниксоидов, Makefile с заглавной буквы 'M'):

# tiny makefile for a tiny program

all:
@echo Pick 'make posix' for UNIX/cygwin or 'make windows' for Windows

posix:
@printf "Building easy.c for posix..."
@printf "#define ENV_POSIX" > plateform.h
@gcc -s easy.c -o easy.exe
@echo ok!

windows:
@printf "Building easy.c for windows..."
@printf "#define ENV_WINDOWS" > plateform.h
@gcc -mno-cygwin -s easy.c -lws2_32 -o easy.exe
@echo ok!

---[ easy.c:

#include "plateform.h"
#include <stdio.h>

#ifdef ENV_POSIX
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h> // для INADDR_ANY
#include <signal.h> // для signal()
#else
#include <winsock2.h>
#endif

int main (int argc, char **argv) {

struct sockaddr_in dst;
#ifdef ENV_POSIX
int sock, sid;
#else
SOCKET sock, sid;
WSADATA wsaData;
#endif
int len = sizeof(struct sockaddr);
char buf;
unsigned short port;

// entry point

if(argc<2) {
printf("Usage: easy.exe <tcp-port>\n");
return 1;
}

port = atoi(argv[1]);

if(!port) {
printf("Bad <tcp-port> defined!\n");
return 2;
}

#ifdef ENV_POSIX // в позиксе мы игнорируем сигналы, мало ли :)
signal(SIGPIPE, SIG_IGN);
#else ENV_WINDOWS // в Windows мы проверяем версию винсока, мало ли :)
printf("Testing if the WinSock2 version is equal or higher than 2.1...");
if (WSAStartup(MAKEWORD(2,1),&wsaData) != 0) {
printf("failed!\n");
return 1;
}
printf("ok!\n");
fflush(stdout);
#endif

dst.sin_family = AF_INET;
dst.sin_addr.s_addr = htonl(INADDR_ANY);
dst.sin_port = htons(port);
sock = socket(AF_INET,SOCK_STREAM,0);
printf("Waiting for an incoming connection..."); fflush(stdout);
bind(sock,(struct sockaddr*)&dst,len);
listen(sock,1);
sid = accept(sock,(struct sockaddr*)&dst,&len);
printf("done!\nWaiting for incoming data..."); fflush(stdout);
recv(sid,&buf,1,0);
printf("received: [%2X]..."); fflush(stdout);
buf++;
send(sid,&buf,1,0);
printf("done!\n");

#ifdef ENV_POSIX
close(sock);
#else
WSACleanup();
closesocket(sock);
#endif

return 0;
}

Итак, мы набираем 'make posix' для того, чтобы собрать программу под UNIX'ом или под cygwin'ную среду или 'make windows' для того, чтобы не зависеть от cygwin'а и использовать лишь kernel32.dll, ws2_32.dll и msvcrt.dll, которые входят в стандартную поставку каждого дистрибутива Windows. Обратите внимание на размер бинарника: 4096 байт для cygwin, 4608 байт для windows! :)
Категория: Общие Статьи | Добавил: aka_kludge (19.08.2008)
Просмотров: 1965 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
    Главная      
...
На службе : дней

23:42
Обновить


Пользователи
aka_kludge
qwerty
LeadyTOR
aka_Atlantis
AdHErENt
mAss
Sissutr
hiss
DrBio
tHick

Поиск


Copyright tHR - TeAM 2026 г. admin: aka_kludge (ICQ:334449009) Moderator's: LeadyTOR, ... Яндекс.Метрика