3.4. 特殊なファイル名

POSIX の /dev ディレクトリを作成する必要はありません。 Cygwin が自動的に内部でシミュレートします。 これらのデバイスは、ls /dev/tty のようにしない限り、コマンド ls /dev では表示されません。 /dev/ 以下の全てのデバイスを見えるようにしたければ、Igor Pechtchanski による create_devices.sh を利用することが出来ます。

Cygwin は POSIX システムで通常利用される、以下のデバイスをサポートしています: /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 及び /dev/urandom/dev/kmem のような他の POSIX デバイスの開発も予定されています。 Cygwin は様々な Windows 特有のデバイスもサポートしています: /dev/comX(シリアルポートで、COM1 から始まります。ttyS0 と同じです)、 /dev/conin(Windows の CONIN$)、 /dev/conout(Windows の CONOUT$)、 /dev/clipboard(Windows のクリップボードですが、現在はテキストのみサポートしています)、 及び /dev/windows(Windows のメッセージキュー)。

加えて、Windows NT/W2K/XP ではフロッピー、ディスク、パーティションやテープのような raw デバイスをサポートしています。 二つの異なった方法によってサポートされる POSIX デバイス名を利用して、Cygwin アプリケーションからこれらのデバイスにアクセス出来ます。

Cygwin 1.3.3 まで、これらのデバイスにアクセスする唯一の方法は Win32 デバイス名を POSIX デバイス名へとマウントすることでした。 この利用方法は Cygwin 1.3.4 以降は推奨されておらず、後方互換性のためにのみ残されています。

Cygwin 1.3.4 からは、固定の POSIX デバイス名を利用することによって Cygwin のプロセスから raw デバイスへとアクセスすることが可能となりました。 これら固定の POSIX デバイス名は、NT の内部名前空間から POSIX の名前空間への直接変換によって生成されています。 例えば、最初のハードディスクは NT 内部デバイス \device\harddisk0\partition0 であり、三番目のハードディスクにある最初のパーティションは \device\harddisk2\partition1 です。 システムの最初のフロッピーは \device\floppy0、最初の CD-ROM は \device\cdrom0、最初のテープドライブは \device\tape0 です。

新しい固定 POSIX 名は、NT 内部デバイスと以下のように対応付けられています。

/dev/st0    \device\tape0、巻き戻しあり
/dev/nst0   \device\tape0、巻き戻しなし
/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	(ディスク全体)
/dev/sda1   \device\harddisk0\partition1	(最初のパーティション)
...
/dev/sda15  \device\harddisk0\partition15	(15 番目のパーティション)

/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

もしこれらのデバイス名が気に入らなければ、使いやすくするために、 Linux システム上で作られているように自由にシンボリックリンクを作成します。

ln -s /dev/scd0 /dev/cdrom
ln -s /dev/nst0 /dev/tape
...

警告

内部 NT デバイス名や固定デバイス名を自分用のデバイス名へと対応付ける際、マウントテーブルを利用しないように注意して下さい。 同様に、内部 NT デバイス名から自分用のデバイス名へのシンボリックリンクを作成しても、それは望むような動作はしません。 以下に挙げた二つの例は、期待通りには動作しないでしょう。

mount -f -b /dev/nst0 /dev/tape     # 動作しません
mount -f -b /device/tape0 /dev/tape # 動作しません
ln -s /device/tape0 /dev/tape       # 動作しません

実行可能プログラムファイル名は .exe で終わりますが、.exe がコマンド名中に含まれている必要はありません。 すなわち、伝統的な UNIX コマンド名が使用できます。 しかし、.bat及び .com で終わるプログラムについては、拡張子を省略することはできません。

副作用として、filename.exe は存在するが filename は存在しないという場合でも、 ls filenamefilename.exe に関する情報を出力します。 同様の現象として、stat("filename",..) 関数呼び出しは filename.exe に関する情報を返します。 このような二つのファイルは、以下に示すように i ノードを調べれば区別出来ます。

C:\> ls * 
a      a.exe     b.exe
C:\> ls -i a a.exe
445885548 a       435996602 a.exe
C:\> ls -i a a.exe
432961010 b       432961010 b.exe

シェルスクリプト myprog とプログラム myprog.exe があるディレクトリ中に共存していた場合、myprog の実行に際してはプログラムが優先して選択されます。

gcc コンパイラは filename を生成するように指示された場合、filename.exe という名前で実行ファイルを生成します。これによって、UNIX システム用に書かれた多くの Makefile は Cygwin 上でも同様に動作します。

不幸なことに、install 及び strip コマンドは filenamefilename.exe を区別することが出来ません。この二つのプログラムは filename.exe が存在して filename が存在しない場合は失敗してしまうため、一部の Makefile による make は中断してしまうことになるでしょう。 この問題は、必要に応じて「.exe」の存在を想定する install 及び strip の二つのシェルスクリプトを作成することによって解決出来ます。