web-dev-qa-db-ja.com

カーニハンとパイクの挑戦:ファイル名にスラッシュを入れる方法は?

私はちょうどUnixプログラミング環境で次の質問に遭遇しました、Unixに関するKernighanとPikeの古典的な本(私は79ページの以下のテキストを見つけました1984年版、ISBN:0-13-937699-2):

演習3-6。(トリックの質問)/をファイル名に取得するにはどうすればよいですか(つまり、パスのコンポーネントを区切らない/)。

私は何年にもわたってエンドユーザーおよびプログラマーとしてLinuxを使用してきましたが、この質問には答えられません。ファイル名にスラッシュを入れる方法はありません。これはカーネルによって絶対に禁止されています。ブロックデバイスアクセスを介してファイルシステムにパッチを適用するか、Unicodeの同様に見える文字を使用できますが、これらは解決策ではありません。

Linux≠Unixであることは理解していますが、システムはパスからディレクトリ階層を明確に抽出できる必要があるため、同じ原則を適用する必要があります。

誰か知っていますか、この質問をするときにカーニハンとパイクは正確に何を考えましたか?想定される答えは何でしたか? 「トリック」とは正確には何ですか?それとも、元のUnixシステムは、どういうわけかこのスラッシュをエスケープすることを単に許可したのでしょうか?

PD:

私は質問についてブライアン・カーニハンに連絡しました、そしてそれは彼が答えたものです:

答えは「できない」でした(またはそうでした)。

したがって、ティモシーマーティンは正しかったし、緑のダニを取得します。

23
firegurafiku

おそらく、答えはこのトリックの質問の答えの一部と同じです:
どのようにして象から降りますか? そうではありません。ガチョウから入手します。

ブライアンW.カーニハンとロブパイクによる「プログラミングの実践」より6、pg。 158:

Steve BourneがUnixシェル(Bourne Shellと呼ばれるようになった)を書いているとき、 '\ 0'とスラッシュ(ただし、 Unixファイル名には使用できません。

12
Timothy Martin

私はこれをやった。これは、1980年頃にPDP-11で実行されているUNIXシステム上にありました。「WhatXNow?」というファイルを作成しました。次に、バイナリファイル「editor」を使用してディスクデバイスを編集し、inodeの「X」を「/」に変更します(ファイルシステムはマウント解除されています)。

被害者はそれを削除する方法を理解していません。

編集:おっと、Barmarは正解です。デバイスにパッチを適用しないという行を確認できませんでした。はい、それはiノードではなく、私が編集したディレクトリでした。久しぶりです:-)

5
Topher Eliot

/(より正確には、値0x2fのバイト(文字ではなく)です。ほとんどすべてのUnixカーネルが意図的に文字エンコーディングに気づいていない)は、生のディスクブロックが操作されずにディレクトリエントリに到達します。手は、間違いなくカーネルのバグです。

このようなバグは時々発生します。私がパッチノートを読んだ覚えがある1つのケースは、1990年代のイテレーションが…Solarisと言いたいのですが、それは間違っているかもしれません…AppleTalk Filing Protocol(AFP)用のサーバーを提供しました。これは、MacOSのNFSに相当するものです。問題は、クラシックなMacOSでは、パス名コンポーネントに/を完全に許可することでした。代わりに、ディレクトリセパレータは:です。 AFPサーバーは、クライアントから送信されたパス名をディスク上のファイルにマッピングするときにtr :/ /:の道徳的同等物を実行すると想定されていましたが、コードパスを結合します。サーバーはカーネル内に実装されているため、実際には不正なディレクトリエントリを書き出す可能性があります。

(上記の長いバージョンについては、「 comp.unix FAQ#2.2 」の「ファイル名に「/」が含まれている場合はどうすればよいですか?」を参照してください。 。)

1
zwol