次の問題が発生しました。Unixプログラミング環境、KernighanとPikeによるUnixクラシックブック(1984年版ISBN:0-13-937699-2の79ページで次のテキストが見つかりました):
練習3-6。(トリックの質問)ファイル名に/をどのように入れますか(パスコンポーネントを区別せずに/を使用しますか?)
私はエンドユーザーでプログラマーとして長年Linuxを使用してきましたが、この質問に答えることはできません。持つ絶対ファイル名にスラッシュを追加することはカーネルでは厳密に禁止されています。ブロックデバイスアクセスでファイルシステムにパッチを適用したり、Unicodeで同様の文字を使用したりできますが、これは解決策ではありません。
私はLinux≠Unixを知っていますが、システムはパスから明示的にディレクトリ階層を抽出できる必要があるため、同じ原則を適用する必要があります。
KerniganとPikeがこの質問をしたときに何を考えたのか知っている人はいますか?答えは何ですか? 「トリック」とはまさに何ですか?それとも、元のUnixシステムでは何とかスラッシュをエスケープできましたか?
修正する:
この問題についてBrian Kernighanに連絡しましたが、彼の答えは次のとおりです。
答えは「あなたはできません」です。
だからティモシー・マーティンは正しいと緑のダニを得た。
答え1
おそらく答えは、次のような困難な質問に対する答えの一部です。
象から降りる方法は? 知りません。 ガチョウから得ます。
Brian W. KernighanとRob Pikeのプログラミング実習(第1章6ページ)から抜粋。 158:
Steve BourneがUnixシェル(後でBourneシェルとして知られている)を作成したときに、\ 0とスラッシュを除いて、1バイトあたり1文字の値で単一の文字名を持つ254個のファイルを含むディレクトリを作成しました。 Unixファイル名。
答え2
私はこれをしました。これは、1980年頃にPDP-11で実行されているUNIXシステムで発生しました。 「WhatXNow?」というファイルを作成しました。次に、バイナリファイル「editor」を使用してディスクデバイスを編集し、inodeの「X」を「/」(ファイルシステムがマウントされていない)に変更しました。
被害者はそれを取り除く方法を知りません。
編集:そうですね、Bamarの言葉は正しいです。デバイスをパッチしないという内容はそこに表示されませんでした。はい、私が編集しているディレクトリはinodeではなくディレクトリです。かなりだった:-)
答え3
すべてのシナリオ/
(より正確には、文字ではなくバイト値が0x2f;ほとんどすべてのUnixカーネルは意図的に文字エンコーディングを無視する)は、rawディスクブロックを手動で操作せずにディレクトリエントリに入る方法を探します。カーネルのバグは間違いありません。
この間違いは時々起こります。パッチノートを読んだ記憶の1つの例は、1990年代に... Solarisと言いたいのですが、おそらく間違っているはずです...クラシックMacOSと同等のAFP(AppleTalk File Protocol)用のサーバーを提供したことです。問題は、クラシックMacOSでは、ディレクトリ/
区切り文字の代わりにパス名コンポーネントを配置できることです:
。 AFPサーバーはしなければならない道徳的に同等なのは、tr :/ /:
クライアントが送信したパス名をディスク上のファイルにマップすることですが、いくつかのコードパスが欠落しており、サーバーがカーネル内に実装されているため、実際には間違ったディレクトリエントリを作成できます。
(望むよりcomp.unix FAQ #2.2、上記のより長いバージョンでは、「ファイル名に '/'が含まれている場合はどうなりますか?」で始まるセクションです。 )