Cygwin: Unix Under Windows

The modern Windows operating systems are sophisticated enough to run Unix programs. Why would you want to do this when you can run Linux for free? Perhaps you have to use Windows and miss your Unix tools. Perhaps you want to use the GNU development suite for building Windows and Unix programs.

The Cygwin project by Red Hat seeks to create a Unix environment under Windows. Its basis is a library that implements Unix API calls. The distribution includes ports of the GNU development tools and utilities. Lots of other programs have been ported to run under Cygwin. Most Unix programs will compile with only minor changes. Cygwin works with any 32-bit Windows operating system including Windows 95, 98, ME, NT, 2000, and XP. It works much better with the Windows NT derived ones.

Cygwin is easy to install. Download the setup program and run it. You can select where to download the packages, where to install them (the default is c:\cygwin), and which packages to install. There are plenty of packages to choose from. Since you can always install more packages later, I suggest choosing the defaults to get started unless you want particular packages.

Since there are major difference between the Windows and Unix worlds, you need to be aware of some of them when working with Cygwin. The biggest difference is that Cygwin uses a Unix style paths. All paths start from the root (/) and use forward slashes to separate directories. Windows paths use backward slashes and start with drive letters. The Cygwin library translates between Windows and Unix paths. The Cygwin base directory (c:\cygwin) is the Unix root (/). Windows drives are accessible under /cygdrive. For example, e:\ is automatically mapped to /cygdrive/e. Cygwin will even map paths with Windows-style drive letters.

The main problems occur when mixing the two worlds. Windows programs won't understand Cygwinq paths; they need to be translated first. Cygwin programs will mostly understand Windows paths but only if you use forward slashes to separate directories. Also, some of them will get confused with the drive letters even though the Cygwin library will handle them. I suggest that you always use forward slashes. Most Windows program support both forward and backward slashes; doesn't but with bash you have a real shell available.

Cygwin controls the mapping between the Unix and Windows paths through the use of the mount table. The mount table is global to all Cygwin programs. The mount command is used to change the table. Each mount point can also control the line translation. Cygwin provides the cygpath utility for doing the mapping in shell scripts.

Another problem is with the line endings for text files. Windows uses CR and LF characters to separate lines in text files while Unix uses just LF. Windows programs distinguish between handling files in text and binary mode. In text mode, they translate between CRLF and LF at the end of the lines so all the C code that uses "\n" works properly. Most Unix programs don't make this distinction and can have trouble when reading Windows-style end-of-line characters. Cygwin allows changing this behavior for each mount point. The problem mainly occurs when mixing DOS-style and Unix-style text files and programs. Stick to one environment and you should be okay.

Cygwin also maps between Windows and Unix permissions. NT has a sophisticated security model based on Access Control Lists (ACLs). The chmod and chown commands work mostly as expected. Since many programs expect /etc/group and /etc/passwd files, Cygwin provides commands to construct them from the Windows equivalents. Windows 9x doesn't have any security model so Cygwin fakes file ownership and permissions.

Another wrinkle is that quite a few Unix programs have been ported to Windows without using Cygwin. These programs won't understand the Unix paths but sometimes they integrate better with Windows environment. I'll have more articles dealing with Emacs, Perl, Tcl/Tk, Apache, TeX, and XFree86.

There are other Unix environments for Windows. MinGW is a good minmialist implementation. It uses the GNU C compiler to create Windows programs that don't have any dependency on other libraries. Most of the ports that don't use Cygwin use MinGW. There are also commercial solutions like those from MKS.