Cygwin

**Cygwin** là môi trường *nix trong Windows bằng cách tạo một lớp tương thích. Thông qua đó người dùng Windows có thể chạy các ứng dụng mà vốn vẫn phổ biến trên Linux, Unix sau khi chương trình đó được chuyển qua Cygwin.

Hiện nay Cygwin chạy trên các bản chính thức của Windows (cả 32 bit và 64 bit) kể từ Windows Vista.

Cygwin bao gồm hai phần:
* Một file DLL (cygwin1.dll) đóng vai trò của Lớp tương thích theo hình thức API, cung cấp một nền tảng các tính năng thiết yếu theo chuẩn POSIX.
* Rất nhiều công cụ, chương trình, môi trường phát triển phần mềm,... của GNU và cộng đồng mã nguồn mở vốn phổ biến trong Linux được chuyển sang để chạy trên nền tảng nói trên.

Nghĩa là, Cygwin không phải một môi trường giả lập hoặc ảo hoá: Không thể dùng Cygwin để chạy các chương trình của *nix nguyên bản; các chương trình đó phải được chuyển qua và biên dịch lại trên Cygwin. Cygwin cũng không phải là sự mở rộng Windows để biến Windows thành một thành viên của *nix: Cách quản lý tiến trình, bộ nhớ, thiết bị,... của Windows là giữ nguyên, và Cygwin chỉ là triển khai thêm một lớp tương thích trên đó, để nhờ vậy mà có thể chuyển các chương trình của *nix qua chạy được trên Windows.ws.

Cygwin ban đầu được Cygnus Solutions phát triển, và sau đó được Red Hat mua lại. Đây là chương trình miễn phí và mã nguồn mở theo điều khoản bản quyền GPL. Hiện nay nó được duy trì và phát triển bởi các nhân viên của Red Hat, NetApp và rất nhiều lập trình viên tình nguyện khác.

## Đặc điểm Cygwin như một lớp tương thích
* Chương trình sử dụng Cygwin chính là chương trình chạy trên nền Windows (chẳng qua là dùng thêm thư viện cung cấp bởi file DLL mà Cygwin cung cấp).
* Nghĩa là, muốn chuyển một chương trình đã có trên Linux hay BSD hoặc *nix khác sang Windows, thì phải đưa mã nguồn chương trình đó biên dịch lại trên Cygwin/Windows.
* Do đó chương trình đó không hề có bất kỳ bất lợi nào về tốc độ hay tính tương thích (như chạy trên nền giả lập hoặc ảo hóa).
* Cygwin có thể được dùng như một môi trường phát triển phần mềm cho các hệ điều hành *nix: lập trình viên có thể phát triển chương trình của mình trên Cygwin, sau đó chuyển sang các *nix khác.
* Không phải toàn bộ POSIX có thể chuyển sang Windows vì cách thức làm việc khác biệt của hệ điều hành Windows. Trong đó vấn đề lớn nhất mà Cygwin gặp phải là lời gọi fork().
* Cách quản lý tiến trình và quản lý đĩa của Windows là khác với hệ *nix. Người sử dụng sẽ cảm nhận rằng Cygwin là cho phép chạy các chương trình của *nix trên Windows với phong cách quản lý của Windows, chứ không phải biến đổi Windows thành *nix.

Hiện nay, Cygwin là một trong những giải pháp phổ biến nhất để đưa các chương trình trên *nix sang chạy trên Windows. Một số chương trình là chuyển qua và được cung cấp như là một chương trình chạy trên Cygwin. Một số là dùng môi trường Cygwin để biên dịch, sau đó ghép thẳng phần lõi của Cygwin vào trong chương trình khi đóng gói, nghĩa là người sử dụng không cần cài riêng Cygwin.

## Chương trình mà Cygwin cung cấp
Bản thân Cygwin cung cấp các chương trình phổ biến mang tính nền tảng mà vẫn thấy trên Linux hay Unix khác:
* Hầu hết các công cụ của GNU, và các công cụ phổ biến khác như: sed, awk, grep, wget, bc,...
* Các chương trình điển hình: perl, python, vim,...
* Các chương trình và thư viện để phát triển phần mềm: make, gcc,...
* Cygwin/X: Một triển khai của X window.
* Giao diện đồ họa mà chương trình có thể lựa chọn là X server hoặc là bản thân nền Windows. Đương nhiên, do đặc điểm là chương trình ứng dụng nào vốn đã được viết để chạy ngay trên Windows rồi (ví dụ Firefox, Gimp, Pidgin) thì nói chung không có nhu cầu thông qua Cygwin để chuyển sang Windows nữa. Do đó hầu như tất cả chương trình có giao diện đồ hoạ mà Cygwin cung cấp là theo giao diện X. Tuy nhiên vẫn có ngoại lệ. Điển hình nhất là Emacs. Mặc dù Emacs có phiên bản chạy trực tiếp trên Windows, nhưng người dùng Emacs theo thói quen vẫn thích chạy Emacs trong môi trường có đủ các thứ của *nix (như sed, grep, w3m,...), do đó bản Emacs trên Windows/Cygwin cũng rất được hoan nghênh. Cygwin cung cấp Emacs cả bản trên X và trên Windows.
* Một số chương trình sử dụng Cigwin để tạo phiên bản chạy trên Windows, như LibreOffice, OpenOffice, Oracle Java; thậm chí một số web server như lighttpd, thậm chí cả Hiawatha.
* mintty - chương trình terminal của Cygwin dùng giao diện Windows. Người dùng có thể dùng mintty thay cho cmd.exe.

## Cygwin/X
**Cygwin/X** là một triển khai của X window bằng cách chuyển Xorg sang chạy trên nền Cygwin. Nghĩa là Cygwin/X có thể đóng vai như một máy chủ X (X server) cho phép các chương trình dùng X (kể cả các chương trình chạy từ xa, chẳng hạn qua ssh) là có thể dùng tích hợp giao diện trong Windows.

Người dùng không bắt buộc phải dùng Cygwin/X trên nền Cygwin; nghĩa là có thể dùng X server khác (như Xming hay MobaXterm) thay cho vị trí của Cygwin/X.

## Cygwinports
**Cygwinports** là một nỗ lực của cộng đồng chuyển rất nhiều các chương trình khác sang Windows:

* Các chương trình tiện ích: php, mở rộng python, v.v.
* Rất nhiều chương trình ứng dụng đồ hoạ
* Các môi trường làm việc như GNOME, KDE, Xfce, LXDE

## Quản lý tiến trình và quản lý đĩa
Cygwin về cơ bản không quản lý tiến trình và quản lý đĩa, đó là việc của hệ điều hành Windows. Cygwin cung cấp một số giao diện nhất định để đảm bảo tính tương thích và môi trường làm việc.

Lệnh "ps -e" liệt kê các tất cả các tiến trình "của Cygwin". Lệnh "ps -W" liệt kê thêm cả các tiến trình của Windows. Lệnh "kill" cũng thể dùng để tiêu diệt (gửi tín hiệu (signal) tới tiến trình). Các thư mục /dev và /proc cũng được triển khai với đầy đủ tính năng. Tuy nhiên, đối với người sử dụng tương tác trên màn hình, tốt nhất vẫn là dùng các tiện ích của Windows để quản lý tiến trình.

Các ổ đĩa của Windows được tự động ánh xạ sang cách đặt tên theo chuẩn POSIX: C: ==> /cygdrive/c, D: ==> /cygdrive/d, v.v. Cũng có thể truy cập đến các máy Windows khác với ánh xạ từ tên kiểu Windows sang tên kiểu POSIX ví như: \\server\sharefolder ==> //server/sharefolder. Chương trình mount mà Cygwin cung cấp có thể dùng để ánh xạ một thư mục của Windows sang hệ thống cây thư mục POSIX.

Cygwin cũng hiểu được cơ chế link của NTFS của Windows, kể cả theo cơ thế link shortcut hay junction. Tuy nhiên khi dùng lệnh "ln -s" của Cygwin, thì sẽ tạo ra 1 file riêng kiểu Cygwin để đảm bảo tương thích hơn với POSIX. Trước đây lệnh "ln -s" Cygwin vẫn dùng cách link của NTFS để giả lập link theo chuẩn POSIX, nhưng vì hai bên không hoàn toàn tương thích, do đó về sau đã triển khai cách riêng. Với nhu cầu thông thường, người sử dụng nên dùng cách link của Windows (bằng lệnh "mklink" của Windows, hoặc bằng Exlorer của Windows), tuy nhiên cách làm này có thể mất tính tương thích với POSIX. Do đó, nếu cần tính tương thích cao hơn thì vẫn là nên dùng lệnh "ln -s" của Cygwin.

## Quản lý người dùng (user) và nhóm (group)
Có thể dùng cách thức kinh điển của *nix ở đây cho các "người dùng" và "group" riêng của Cygwin. Có một ánh xạ tự động mã số người dùng (user ID) và mã số nhóm (group ID) sang mã số tương ứng của Windows để đảm bảo không xảy ra xung đột.

## Xem thêm
* Lớp tương thích
* GnuWin32
* MSYS
* Cooperative Linux
* Cygwin/X
* Cygwinports

## Tham khảo

## Liên kết ngoài
*Trang chủ của Cygwin
*Trang chủ của Cygwin/X
*Trang chủ của Cygwinports