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 Cygwin automatically simulates it internally.
These devices cannot be seen with the command ls /dev/
although commands such as ls /dev/tty work fine.
If you want to be able to see all devices in
/dev/, you can use Igor Pechtchanski's
create_devices.sh
script.
Cygwin supports the following devices commonly found on POSIX systems:
/dev/dsp, /dev/null,
/dev/zero, /dev/console,
/dev/tty, /dev/ttym,
/dev/ttyX, /dev/ttySX,
/dev/pipe, /dev/port,
/dev/ptmx, /dev/mem,
/dev/random, and /dev/urandom.
Some other POSIX devices, such as
/dev/kmem, are planned for development.
Cygwin also has several Windows-specific devices:
/dev/comX (the serial ports, starting with
COM1 which is the same as ttyS0),
/dev/conin (Windows CONIN$),
/dev/conout (Windows CONOUT$),
/dev/clipboard (the Windows clipboard, currently
text only), and /dev/windows (the Windows message
queue).
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 Cygwin 1.3.3 the only way to access those devices was to mount the Win32 device names to a POSIX device name but this usage is discouraged since Cygwin 1.3.4 and only kept for backward compatibility.
Beginning with Cygwin 1.3.4, raw devices are accessible by Cygwin processes using fixed POSIX device names. These 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/sr0 \device\cdrom0 /dev/sr1 \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/nst0 /dev/tape ...
Note that you can't use the mount table to map from a fixed device name to your own device name or to map from internal NT device name to your own device name. Also using symbolic links to map from the internal NT device name to your own device name will not do what you want. The following three examples will not work as expected:
mount -f -b /dev/nst0 /dev/tape # DOES NOT WORK mount -f -b /device/tape0 /dev/tape # DOES NOT WORK ln -s /device/tape0 /dev/tape # DOES NOT WORK
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.exeC:\>ls -i a a.exe445885548 a 435996602 a.exeC:\>ls -i b b.exe432961010 b 432961010 b.exe
If a shell script myprog and a program
myprog.exe coexist in a directory, the shell
script has precedence and is selected for execution of
myprog. Note that this was quite the reverse up to
Cygwin 1.5.19. It has been changed for consistency with the rest of Cygwin.
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.
Cygwin, like Linux and other similar operating systems, supports the
/proc virtual filesystem. The files in this
directory are representations of various aspects of your system,
for example the command cat /proc/cpuinfo
displays information such as what model and speed processor you have.
One unique aspect of the Cygwin /proc filesystem
is /proc/registry, which displays the Windows
registry with each KEY as a directory and each
VALUE as a file. As anytime you deal with the
Windows registry, use caution since changes may result in an unstable
or broken system.
The Cygwin /proc is not as complete as the
one in Linux, but it provides significant capabilities. The
procps package contains several utilities
that use it.
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' > mylistbash$echo @mylist@mylistc:\>c:\cygwin\bin\echo @mylistThis is a long line