Kernighan and Pike Challenge : 파일 이름에 슬래시를 넣는 방법?


23

유닉스 프로그래밍 환경 에서 Kernighan과 Pike의 유닉스 고전 책에서 다음과 같은 질문 을 받았습니다 (1984 년 판 79 : ISBN : 0-13-937699-2에서 아래 텍스트를 찾았습니다).

운동 3-6. (트릭 질문) /를 파일 이름으로 가져 오는 방법 (예 : 경로의 구성 요소를 분리하지 않는 /)?

나는 최종 사용자와 프로그래머 모두 리눅스와 함께 일해 왔지만이 질문에 대답 할 수는 없다. 파일 이름에 슬래시를 넣을 방법없으며 커널에서 절대로 금지되어 있습니다. 블록 장치 액세스를 통해 파일 시스템을 패치하거나 유니 코드에서 비슷한 모양의 문자를 사용할 수는 있지만 해결책은 아닙니다.

나는 리눅스 ≠ Unix라는 것을 이해하지만, 시스템은 경로에서 디렉토리 계층을 명확하게 추출 할 수 있어야하므로 동일한 원칙이 적용되어야한다.

이 질문을 할 때 Kernighan과 Pike가 정확히 무엇을 생각했는지 아는 사람이 있습니까? 예상되는 답변은 무엇입니까? '트릭'은 정확히 무엇입니까? 아니면 오리지널 유닉스 시스템이 단순히이 슬래시를 피할 수 있었을까요?

UPD :

나는 질문에 대해 Brian Kernighan에게 연락했고 그것이 그가 대답 한 것입니다.

대답은 "그렇지 않다"였습니다.

따라서 티모시 마틴은 옳았 고 녹색 진드기를 얻었습니다.




흠. 소문자를 포함하는 파일을 작성하고 파일 a시스템이 EBCDIC 로케일에 있다고 생각하도록 시스템을 강제 할 수 있습니까? ASCII a는 0x61이며 /EBCDIC (코드 37 페이지)에 해당
Fox

책 자체가 그게 까다로운 질문이라고 말합니까? 그렇다면, 나는 당신이 이미 언급 한 즉시 아이디어를 남겨두고, 당신이 그것을 디자인 할 수있는 방법을 찾을 수 없다는 것을 거의 확신한다고 생각합니다.
ilkkachu

답변:


12

아마도 답은이 속임수 질문에 대한 답의 일부와 동일
할 것입니다 : 코끼리를 어떻게 내릴까요? 당신은하지 않습니다. 거위에서 가져옵니다.

Brian W. Kernighan과 Rob Pike의 "프로그래밍 실습", Ch. 6, pg. 158 :

Steve Bourne은 자신의 Unix 쉘 (Bourne 쉘로 알려짐)을 작성할 때 '\ 0'과 슬래시를 제외한 각 바이트 값당 하나의 문자 이름으로 254 개의 파일 디렉토리를 만들었습니다. Unix 파일 이름에는 나타나지 않습니다.


3
그 농담을 가르쳐 주셔서 감사합니다. 아마도 영어 유창성 시험으로 작용할 수 있습니다 (방금 실패했습니다).
firegurafiku

당신이 옳았. UPD를 참조하십시오.
firegurafiku

1
@firegurafiku는 농담을 설명 합니다.
Isaac Isaac

5

나는 이것을했다. 이것은 1980 년경 PDP-11에서 실행되는 UNIX 시스템에있었습니다. "WhatXNow?"라는 파일을 만들었습니다. 그런 다음 바이너리 파일 "editor"를 사용하여 디스크 장치를 편집하고 inode에서 "X"를 "/"(파일 시스템이 마운트 해제 된 상태)로 변경했습니다.

피해자는 그것을 제거하는 방법을 찾지 못했습니다.

편집 : 으악, Barmar가 옳습니다. 장치를 패치하지 않는 것에 대한 줄을 보지 못했습니다. 그리고 네, 내가 편집 한 디렉토리가 아니라 inode입니다. 오랜만이야 :-)


1
파일 이름은 inode에 없으며 디렉토리 특수 파일에 있습니다.
Barmar

1
나는 fsck그것을 제거했을 것입니다.
Barmar

1
문제는 블록 장치 액세스를 통해 파일 시스템을 패치하거나 유니 코드에서 비슷한 모양의 문자를 사용할 수 있지만 솔루션은 아닙니다. 당신이 당신의 대답에 묘사하고 있지 않습니까?
Barmar

@Barmar : 흠, 어쩌면 나는 질문을 너무 많이 생각하고 있고 파일 시스템 패치는 의미있는 해결책입니까? 모르겠어요
firegurafiku

나는 이것이 답이라고 확신합니다. 언제 디렉토리를 읽을 수 있는지 기억합니다. 어쩌면 뿌리가 그것들을 쓸 수 있었을 것입니다.
Joshua

1

/(더 정확하게는 0x2f 값을 가진 문자가 아닌 바이트-거의 모든 유닉스 커널이 의도적으로 문자 인코딩을 잊어 버린) 모든 시나리오 는 원시 디스크 블록을 손으로 조작하지 않고 디렉토리 항목으로 들어가는 길을 의심 할 여지가 없습니다. 커널의 버그.

이러한 버그는 때때로 발생합니다. 필자가 패치 노트를 읽은 것을 기억하고있는 한 가지 사례는 1990 년대 경에 반복 된 솔라리스에 대해 말하고 싶지만 틀렸을 수도있다. AFP (AppleTalk Filing Protocol)에 대한 서버를 제공했다. . 문제는 클래식 MacOS /에서는 경로 이름 구성 요소 를 완벽하게 넣을 수 있다는 것 입니다. :대신 디렉토리 구분자가 있습니다. AFP 통신 서버는 한 가정 의 도덕적 동등 할 tr :/ /:그 디스크에있는 파일에 클라이언트에 의해 제출 된 경로 이름을 매핑 할 때,하지만 그들은 몇 가지 코드 경로를 놓친, 서버가 커널 내부에 구현 되었기 때문에, 실제로 나쁜 디렉토리 항목을 작성할 수 있습니다.

위의 더 긴 버전에 대해서는 "파일 이름에 '/'가 있으면 어떻게됩니까?"하위 섹션 인 comp.unix FAQ # 2.2를 참조하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.