Kernighan ve Pike mücadelesi: dosya adına nasıl eğik çizgi koyulur?


23

Kernighan ve Pike'nin Unix'teki klasik kitabı olan Unix Programlama Ortamı'nda şu soru ile karşılaştım (aşağıdaki metni 1984 yılının 79. sayfasında, ISBN: 0-13-937699-2'de buldum):

Egzersiz 3-6. (Hile sorusu) Dosya adının içine / içine nasıl girersiniz (yani, yolun bileşenlerini ayırmayan bir /.

Hem son kullanıcı hem de programcı olarak yıllardır Linux ile çalışıyorum ama bu soruyu cevaplayamıyorum. Orada hiçbir şekilde Dosya adlarında eğik çizgi koymak için kesinlikle çekirdek tarafından yasak. Dosya sisteminize engelleme aygıtı erişimi aracılığıyla yama yapabilir veya Unicode'dan benzer görünen karakterler kullanabilirsiniz, ancak bunlar çözüm değildir.

Anladığım kadarıyla Linux understand Unix, fakat aynı prensip geçerli olmalı, çünkü sistemin dizin hiyerarşisini açıkça yollardan çıkarabilmesi gerekiyor.

Birileri Kernighan ve Pike'nin bu soruları sorurken tam olarak ne düşündüğünü biliyor mu? Sözde cevap neydi? 'Hile' tam olarak nedir? Ya da belki orijinal Unix sistemi bir şekilde bu eğik çizgiden kaçmaya izin verdi?

UPD:

Soruyla ilgili Brian Kernighan ile temasa geçtim ve cevapladığı buydu:

Cevap (ya da oldu) “Yapamazsın.”

Bu nedenle, Timothy Martin haklıydı ve yeşil kene aldı.




Hmm. Belki küçük harf içeren bir dosya oluşturabilir ave dosyalarınızı bir EBCDIC yerelinde olduğunu düşünerek sisteminizi zorlayabilirsiniz? ASCII akarşılık 0x61 vardır /(kod sayfası 37) EBCDIC içinde
Fox

Kitabın kendisi bunun hileli bir soru olduğunu mu söylüyor? Öyleyse, bunun çoktan onayladığınızı düşünerek hazırladığınız fikirleri bırakarak, bunu tasarlamanın bir yolunu bulamayacağınızı düşünüyorum.
ilkkachu

Yanıtlar:


12

Belki de cevap, bu hileli sorudaki cevabın parçası olarak aynıdır:
Bir filden nasıl inersiniz? Sen değil. Bir kazdan aldın.

Brian W. Kernighan ve Rob Pike, Ch. 6, sf. 158:

Steve Bourne Unix kabuğunu yazarken (Bourne kabuğu olarak bilinir), '\ 0' hariç her bayt değeri için bir tane olmak üzere tek karakterli isimlerden oluşan 254 dosyadan oluşan bir dizin hazırladı. Unix dosya adlarında görünemez.


3
Bana şakayı öğrettiğin için teşekkür ederim. Muhtemelen, (henüz başarısız oldum) bir İngilizce akıcılık testi olarak işlev görebilir.
firegurafiku

Haklıydın. UPD'ye bakınız.
firegurafiku

1
@firegurafiku Joke'i açıklar .
Isaac

5

Bunu yaptım. Bu, 1980 civarında bir PDP-11'de çalışan bir UNIX sistemindeydi. "WhatXNow?" Adlı bir dosya oluşturdum. Daha sonra disk aygıtını düzenlemek ve inode içindeki "X" i "/" olarak değiştirmek için ikili dosya kullandım (dosya sistemi sökülmeden).

Kurban asla nasıl çıkarılacağını çözemedi.

Düzenleme: whoops, Barmar haklı, orada cihaz yama değil ilgili çizgiyi görmedim. Ve evet, düzenlediğim dizin, inode değildi. Bir süre oldu :-)


1
Dosya adları inode'da değil, özel dosya dizininde.
Barmar

1
Sanırım fsckkaldırırdı.
Barmar

1
Soru , dosya sisteminizi engelleme aygıtı erişimi yoluyla ya da Unicode'dan benzer görünen karakterler kullanarak ekleyebileceğinizi söylüyor , ancak bunlar çözüm değil. Cevabında tanımladığın şey bu değil mi?
Barmar

@Barmar: Hmm, belki soruyu çok fazla gözden geçiriyorum ve dosya sisteminin eklenmesi amaçlanan çözüm mü? Bilmiyorum.
firegurafiku

Eminim cevap buydu. Dizinleri ne zaman okuyabildiğini hatırlıyorum. Belki de yıllar önce kök onları yazabiliyordu.
Joshua,

1

Herhangi bir senaryo /(daha kesin olarak, bir bayt bir karakter ile değer 0x2F, hemen hemen tüm Unix çekirdekleri karakter kodlamasına kasıtlı habersiz) ham disk blok bir dizin giriş yolunu bulur, tartışmasız el ile hareket edilerek çekirdekte bir böcek.

Bu tür hatalar zaman zaman olur. Yama notlarını okuduğumu hatırladığım bir durum, 1990'ların bazı dönemlerinin yinelemeleri… Solaris demek istiyorum, ancak bu yanlış olabilir… klasik MacOS'un NFS eşdeğeri olan AppleTalk Dosyalama Protokolü (AFP) için bir sunucu önerdi . Sorun, klasik MacOS'ta /, bir yol adı bileşenine mükemmel şekilde girmenize izin verildi ; :Bunun yerine dizin ayırıcı . AFP sunucusunun, istemciler tarafından gönderilen dosya adlarını diskindeki dosyalara eşlerken ahlaki bir eşdeğer olması gerekiyordutr :/ /: , ancak birkaç kod yolunu kaçırdılar ve sunucu çekirdeğin içine yerleştirildiği için aslında kötü dizin girişleri yazdırabilirdi.

( Yukarıdakilerin daha uzun bir sürümü için bkz. Comp.unix SSS # 2.2 , "Dosya adında '/' varsa?" Başlığındaki alt bölüme bakın .)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.