続C言語教室 - 第20回 ファイル操作(4) 特殊ファイルとか
ファイル操作ということで、ファイルには「普通のファイルとディレクトリがあって」と進めてきましたが、ファイルの中には他にも特殊なファイルがあります。
1つ目が「シンボリックファイル」と呼ばれるもので、既にあるファイルに対して別名を作ることが出来ます。リンクを作成するとどちらの名前で開いても同じファイルが開かれることになります。シンボリックファイルには元になるファイルの名前が書いてあるだけなので、元になるファイルが削除されたり移動されたり(名前の変更も含む)するとアクセスできなくなってしまいます。Windowsでは「ショートカットファイル」が、ほぼこれにアタリます(厳密にはそれなりに違うところもある)。普通に読み書きする場合、そのファイルがシンボリックリンクであるかどうかを気にする必要は無いのですが、リンク先が無いとかリンク先の権限の問題で特有のエラーが出ることがあります。シンボリックファイルはあくまで path でリンク先を指定するものなので、リンク先が同じファイルシステム(ドライブ)上に無いことがあり、これがやっかりな問題を引き起こすことがあります。心配であれば path がシンボリックファイルであるかは、やはり stat() などを呼び出して確認する必要があります。また Windows の場合は専用のAPIを使うので注意が必要です。
manページ — STAT
2つ目が「デバイスファイル」と呼ばれるものです。デバイスとは端末(シリアル回線)であったり、ディスクや光学ドライブ、そして特定のメモリ領域なんかもデバイスとして扱われます。UNIX系であれば、これらのデバイスは /dev という特定のディレクトリの下に置かれるのですが、MS-DOSユーザならお馴染みの CON であるとか PRN が、これに該当します。
デバイスファイル
デバイスファイルには大きく分けて2種類があり、ストリームとしてしか扱えないキャラクタデバイスとランダムアクセスが出来るブロックデバイスがあります。端末などが前者でディスクなどが後者です。デバイスの詳細はAPIを呼ぶことで得られますが、UNIX系の場合、端末には tty を含んだ名前が使われ、ディスクは hd であるとか sd といった名前から始まるものが使われています。ちょっと変わっているのがいつでも 0 の値が戻るだけの /dev/zero であったり、乱数が得られる /dev/randam または /dev/urandom なんていうデバイスもあったりします。そしてMS-DOS では階層化ディレクトリが導入される以前に使われだしたデバイス名がパスを含まない文字列として予約されており(回避策はある模様)、CON であるとか PRN、AUX、そして NUL というファイル名が使えなかったりします。他にも COM+数字1文字、LPT1、LPT2 などもアウトです。これらの名前は今では \dosdevices という特定の名前のパスに割り当てられてはいるようですが、ドライブ名の扱いも含めてなかなかやっかいな非互換性を生み出しています。
ローカルおよびグローバル MS-DOS デバイス名
ブロックデバイスは(権限があれば)、通常のファイルのように開いて読み書きすることが出来るので、ファイルシステムの修復を試みる場合などに使えはしますが、間違っても活きているファイルシステムをいじってしまったら何が起こるかはご想像にお任せします。
デバイスファイル
特殊ファイルはOSによってその詳細がかなり異なりますし、デバイスやファイルシステムに関する知識も必要になります。とはいえデバイスという特殊な扱いが必要になるものをファイルという一般的な形で使えるようにしたのが UNIX(そしてその影響を受けたいろいろなOS) の素敵なところです。逆に言うと単にファイルを開いたつもりだったのに、ちょっと挙動がおかしいということも出てきてしまうわけです。調べる手立てはあるのですがなにはともあれエラー処理をきちんと書いておくのが吉であることには違いありません。
【Linux入門】Linuxのファイルの種類
f15: linux における 普通のファイル (regular file) とは?
ところで、UNIX系限定なのですが、/proc であるとか /sys には、システムに関する情報がファイルとして取得できるので複雑なAPIを呼ばなくても済みます。
/proc
さてメモリに関するファイルについては次回にしますか。
ヘッダ画像は、AIにこの記事の文章を食べさせて生成しました。
#プログラミング #C言語 #プログラミング講座 #C言語教室 #シンボリック #デバイスファイル #CON #特殊ファイル #stat #ブロックデバイス #キャラクタデバイス