Apakah direktori dihapus ketika jumlah tautannya menjadi 0?

10

Apakah direktori dihapus ketika jumlah tautannya menjadi 0?

Direktori selalu memiliki setidaknya 2 sebagai jumlah tautan kerasnya, karena .. Ketika rm -rsebuah direktori, apakah itu mengurangi jumlah tautan keras dari 2 menjadi 0 oleh 2 bukannya 1?

Bisakah jumlah tautan keras suatu direktori menjadi 1?

Terima kasih.

Tim
sumber

Jawaban:

9

Pertama tidak semua sistem file menggunakan .dan ..sebagai tautan keras. ini didokumentasikan dalam manual menemukan gnu. Saya akan mengabaikan sistem file itu untuk sisa jawaban saya karena mereka tidak dirancang untuk unix dan hanya mempersulit hal-hal tanpa menambahkan kejelasan. Saya juga akan mengabaikan direktori root dan me-mount poin untuk alasan yang sama.

jumlah tautan ke direktori tidak pernah kurang dari dua karena .dan ... Jumlah subdirektori sama dengan jumlah tautan minus dua. Karena itu, Anda tidak dapat menautkan atau memutus tautan direktori, sehingga file rm -rakan statdihapus sebelum digunakan dan rmdirbukan unlinkpada direktori. Dua panggilan sistem menggunakan jalur kode yang sama sekali berbeda di kernel.

Hildred
sumber
Terima kasih. Direktori memiliki tautan keras .., hanya ketika memiliki subdirektori, benar? Jadi ..tidak selalu hadir untuk direktori, bukan?
Tim
..hadir di setiap direktori yang merupakan subdirektori. yang semuanya tetapi /yang memiliki satu juga, jadi semua direktori.
Hildred
1
(1) Jika direktori tidak memiliki subdir, direktori tersebut tidak memiliki tautan keras ..ke direktori itu sendiri. Apa tautan keras ke dir? file dengan pathname, dan .? (2) mengapa Anda mengabaikan poin mount?
Tim
Jika direktori adalah sub-direktori. entri ..akan mengarah ke induk. Sebagai kasus khusus, tautan direktori root menunjuk ke dirinya sendiri. Ini memungkinkan cd ..\..dan perintah serupa berfungsi seperti yang diharapkan di mana pun Anda berada. Anda dapat menguji dengan statperintah.
BillThor
1
Anda benar bahwa jumlah tautan tidak pernah kurang dari 2, tetapi bukan karena ... Itu karena .dan nama di direktori induk yang menunjuk ke sana. Satu-satunya pengecualian adalah root, yang tidak memiliki orangtua. Tetapi telah ..menunjuk ke dirinya sendiri, sehingga ia juga memiliki jumlah tautan = 2.
Barmar
11

File apa pun pada sistem file UNIX yang dirancang secara konvensional yang jumlah rujukannya (mis. Jumlah jumlah hardlink dan jumlah pegangan file terbuka *) mencapai 0 dihapus. Namun, pada sistem UNIX modern, rmdirpemanggilan sistem menghapus direktori kosong dalam satu operasi daripada menghapus .dan ..satu-per-satu.

Namun, dalam sistem UNIX historis, pemanggilan sistem ini tidak ada. Sebaliknya, rmdir perintahnya adalah program setuid ( kode sumber dapat ditemukan di sini ) yang memeriksa bahwa direktori kosong (selain entri khusus), dan kemudian dihapus ..dan ., dalam urutan itu, dan kemudian menghapus direktori itu sendiri, semua dengan unlinksystem call yang hanya root yang diizinkan untuk digunakan pada direktori (karenanya mengapa perintah itu ditetapkan). Jadi, pada sistem-sistem itu, jumlah tautan suatu direktori untuk sementara akan menjadi 1 setelah .dihapus tetapi sebelum direktori dihapus dari direktori induk, maka itu akan menjadi 0.

The rmperintah, kebetulan, dicegah bahkan akar dari menghapus direktori. Dan rm -rakan memanggil rmdirperintah untuk menghapus direktori setelah mengosongkan isinya.

Pada sistem historis ini, menyalahgunakan unlinkpanggilan dari program yang berjalan sebagai root, berlari ke kondisi balapan dengan rmdiratau mv, atau membuat file dalam suatu proses yang direktori saat ini telah dihapus (sistem modern mencegah ini), dapat mengakibatkan menjuntai file atau direktori yang memiliki jumlah hardlink di atas 0 tetapi tidak ada di pohon direktori. Kondisi ini terdeteksi oleh dcheck, dan masih menjadi salah satu pemeriksaan fsckkarena masih dimungkinkan secara fisik pada sebagian besar sistem file.


Sistem file , secara kebetulan, tidak diharuskan untuk mengimplementasikan direktori (termasuk .dan ..) sebagai file normal yang memiliki hardlink. Pada sistem file ini, jumlah hardlink dari suatu direktori akan selalu dilaporkan sebagai 0(tetapi tentu saja, keberadaannya di dalam direktori induk memenuhi syarat untuk "jumlah referensi" dari 1).


Perilaku direktori yang dihapus (misalnya ketika diperiksa oleh suatu proses yang sudah terbuka atau memilikinya sebagai direktori saat ini) dan makna yang tepat dari "jumlah tautan" direktori tidak ditentukan. Pada Mac OS X, misalnya, ia akan melaporkan jumlah hardlink 2 , meskipun tidak memiliki hardlink nyata. Meskipun .dan ..tidak muncul dalam daftar, direktori dapat dibuka dan statdapat dipanggil dengan nama .atau ... Di Linux, jumlah tautannya adalah 0 tetapi .dan ..juga masih berfungsi.

Mac OS X juga melaporkan jumlah semua file dalam direktori sebagai jumlah tautan, alih-alih hanya jumlah subdirektori. Tetapi sekarang sudah 2 .dan ..sudah tiada.


* Ini termasuk deskriptor terbuka normal, bagian yang dipetakan dengan memori (termasuk misalnya mengeksekusi binari dan perpustakaan bersama), dan memproses direktori saat ini.

Random832
sumber
2
strcpyke array ukuran tetap dalam setuid yang dapat dieksekusi ... ini adalah saat yang tepat!
Andrea Corbellini
@AndreaCorbellini Sebenarnya ada eksploitasi yang diterbitkan mkdirberdasarkan fakta bahwa ia harus melakukan hal yang sama secara terbalik.
Random832
1
Saya rasa saya menemukannya: securityfocus.com/archive/1/365038/2004-05-31/2004-06-06/0 :)
Andrea Corbellini
bertanya tentang rmdir, tidak akan ..menghapusdalam menghapus direktori induk?
Edward Torvalds
@edwardtorvalds Tidak, saya merujuk pada penghapusan tautan ".." itu sendiri, bukan direktori induk yang ditunjuknya.
Acak 832