Windows filenames invalid under Windows are also invalid under Cygwin. This means that base filenames such as AUX, COM1, LPT1 or PRN (to name a few) cannot be used in a regular Cygwin Windows or POSIX path, even with an extension (prn.txt). However the special names can be used as filename extensions (file.aux). You can use the special names as you would under DOS, for example you can print on your default printer with the command cat filename > PRN (make sure to end with a Form Feed).
There is no need to create a POSIX /dev directory as it is simulated within Cygwin automatically. It supports the following devices: /dev/null, /dev/zero, /dev/tty, /dev/ttyX, /dev/ptmx, /dev/comX (the serial ports), /dev/windows (the windows message queue), /dev/random and /dev/urandom. These devices cannot be seen with the command ls /dev although commands such as ls /dev/tty work fine.
Windows NT/W2K/XP additionally support raw devices like floppies, disks, partitions and tapes. These are accessed from Cygwin applications using POSIX device names which are supported in two different ways. Up to 1.3.3, Cygwin only uses Win32 device names, since 1.3.4 it additionally uses NT internal device names.
Up to Cygwin 1.3.3 the only way to access those devices is to mount the Win32 device names to a POSIX device name.
The Win32 device name for a partition is the drive letter with leading \\.\, so the floppy would be \\.\A:, the first partition typically \\.\C:. Complete drives (except floppies and CD-ROMS which are supported as partitions only) are named \\.\PHYSICALDRIVEx. The x is the drive number which you can check in the disk manager. Each drive line has prepended the text "Disk x".
To access tape drives the Win32 file name \\.\TAPEx is used. For example the first installed tape device is named \\.\tape0.
The naming convention is simple: The name of the POSIX device has to begin with /dev/ and the rest is as you like. The only exception are tape devices. To identify if the tape device is used as a rewind or a no-rewind device the name must not begin with n (rewind) or has to begin with n (no-rewind).
Some examples:
mount -b //./A: /dev/fd0 # mount floppy as raw block special mount -b //./physicaldrive1 /dev/hdb # mount "Disk 1" mount -b //./tape0 /dev/st0 # mount first tape as the rewind device... mount -b //./tape0 /dev/nst0 # ...and as the no-rewind device |
Note the usage of the -b option. It is best to include the -b option when mounting these devices to ensure that all file I/O is in "binary mode".
Since Cygwin 1.3.4 raw devices are accessible from inside of Cygwin processes using fixed POSIX device names. That means, you don't have to mount the devices anymore which results in a more cleaner mount table.
These new fixed POSIX device names are generated using a direct conversion from the POSIX namespace to the internal NT namespace. E.g. the first harddisk is the NT internal device \device\harddisk0\partition0 or the first partition on the third harddisk is \device\harddisk2\partition1. The first floppy in the system is \device\floppy0, the first CD-ROM is \device\cdrom0 and the first tape drive is \device\tape0.
The new fixed POSIX names are mapped to NT internal devices as follows:
/dev/st0 \device\tape0, rewind /dev/nst0 \device\tape0, no-rewind /dev/st1 \device\tape1 ... /dev/fd0 \device\floppy0 /dev/fd1 \device\floppy1 ... /dev/scd0 \device\cdrom0 /dev/scd1 \device\cdrom1 ... /dev/sda \device\harddisk0\partition0 (whole disk) /dev/sda1 \device\harddisk0\partition1 (first partition) ... /dev/sda15 \device\harddisk0\partition15 (fifteenth partition) /dev/sdb \device\harddisk1\partition0 /dev/sdb1 \device\harddisk1\partition1 [up to] /dev/sdl \device\harddisk11\partition0 /dev/sdl1 \device\harddisk11\partition1 ... /dev/sdl15 \device\harddisk11\partition15 |
if you don't like these device names, feel free to create symbolic links as they are created on Linux systems for convenience:
ln -s /dev/scd0 /dev/cdrom ln -s /dev/st0 /dev/tape ... |
Note that you can't use the mount table to map from fixed device name to your own device name or to map from internal NT device name to your own device name. The following two examples will not work:
mount -s -f -b /dev/st0 /dev/tape mount -s -f -b /device/tape0 /dev/tape |
Executable program filenames end with .exe but the .exe need not be included in the command, so that traditional UNIX names can be used. However, for programs that end in ".bat" and ".com", you cannot omit the extension.
As a side effect, the ls filename gives information about filename.exe if filename.exe exists and filename does not. In the same situation the function call stat("filename",..) gives information about filename.exe. The two files can be distinguished by examining their inodes, as demonstrated below.
C:\> ls * a a.exe b.exe C:\> ls -i a a.exe 445885548 a 435996602 a.exe C:\> ls -i b b.exe 432961010 b 432961010 b.exe |
The gcc compiler produces an executable named filename.exe when asked to produce filename. This allows many makefiles written for UNIX systems to work well under Cygwin.
Unfortunately, the install and strip commands do distinguish between filename and filename.exe. They fail when working on a non-existing filename even if filename.exe exists, thus breaking some makefiles. This problem can be solved by writing install and strip shell scripts to provide the extension ".exe" when needed.
To circumvent the limitations on shell line length in the native Windows command shells, Cygwin programs expand their arguments starting with "@" in a special way. If a file pathname exists, the argument @pathname expands recursively to the content of pathname. Double quotes can be used inside the file to delimit strings containing blank space. Embedded double quotes must be repeated. In the following example compare the behaviors of the bash built-in echo and of the program /bin/echo.
Example 3-2. Using @pathname
bash$ echo 'This is "a long" line' > mylist bash$ echo @mylist @mylist c:\> c:\cygwin\bin\echo @mylist This is a long line |