deskriptor file vs. nama file


12

Saya bertanya-tanya apa perbedaan dan hubungan antara deskriptor file dan nama file. Apakah mereka semua terbiasa mengakses file? Jika ya, dengan cara yang sama?

Sebagai contoh, /dev/fd/0, /dev/stdin, dan /proc/self/fd/0semua link ke /dev/pts/2. Apakah keempat deskriptor file ini, atau nama file?


Jawaban:


12

Keempat /dev/fd/0, /dev/stdin, /proc/self/fd/0dan /dev/pts/2adalah nama file, seperti /////dev/../dev/fd//0, /bin/sh, /etc/fstab, /fioejfoeijf, dll semua tapi itu contoh terakhir cenderung menjadi nama file yang ada pada mesin Anda. Nama file adalah string yang dapat menunjuk file pada sistem file Anda; di Linux, string apa pun yang tidak mengandung byte nol dan paling panjang 4096 byte adalah nama file yang valid. Banyak dari nama-nama ini setara, misalnya /bin/shsetara dengan ///bin/sh, /bin/../bin/sh(dengan asumsi /bindirektori yang ada), dll. Semua contoh yang saya berikan sejauh ini adalah nama file absolut; ada juga nama file relatif, yang tidak dimulai dengan /dan yang maknanya tergantung pada direktori saat ini.

Terminologi di sekitar nama file tidak universal; terkadang "nama file" berarti path lengkap ke file, dan terkadang itu berarti nama entri direktori. Terminologi POSIX adalah " nama file " atau " komponen pathname " untuk nama entri direktori, dan " pathname " untuk path lengkap.

Deskriptor file menunjuk file terbuka dalam proses tertentu. Kernel memelihara tabel deskriptor file untuk setiap proses. Setiap entri dalam tabel deskriptor file menunjukkan apa yang harus dilakukan jika proses meminta pembacaan, penulisan, dan operasi lainnya pada deskriptor file.

Deskriptor file mungkin terkait dengan file dan memiliki nama yang terkait, tetapi tidak semua dari mereka melakukannya. Bagi mereka yang melakukannya, file tersebut dapat berupa file biasa, direktori, file perangkat atau pipa bernama (juga disebut FIFO) (jenis yang dibuat oleh mkfifo); beberapa sistem memiliki kemungkinan lebih lanjut seperti soket dan pintu unix. Contoh deskriptor file yang tidak memiliki file bernama terkait termasuk pipa (jenis yang dibuat oleh pipe) dan soket jaringan .

/dev/fd/0, /dev/stdindan /proc/self/fd/0merupakan nama file (semuanya setara) dengan makna khusus: semuanya menunjuk file mana yang saat ini diakses melalui deskriptor file 0. Ketika sebuah proses membuka ini, kernel menyalin entri dengan indeks 0 pada tabel deskriptor deskriptor file ke file baru deskriptor. Membuka salah satu file ini sama dengan menelepon dup(0). File-file yang dinamai adalah cara untuk secara tidak langsung mendapatkan proses untuk menggunakan salah satu file yang sudah terbuka daripada membuka file baru; mereka sebagian besar berguna untuk meneruskan baris perintah program, di mana program mengharapkan nama file untuk dibuka.


@ Giles Anda menulis "Setiap entri dalam tabel deskriptor file menunjukkan apa yang harus dilakukan jika proses meminta membaca, menulis, dan operasi lainnya pada deskriptor file." ( Penekanan pada saya). Sejauh yang saya mengerti itu hanyalah bilangan bulat seperti standar 0,1,2 dll untuk stdin, stdout dan stderr masing-masing. Ini akan menjadi angka yang bernilai lebih tinggi untuk file biasa. Apa yang saya tidak dapatkan dari komentar Anda adalah bagaimana angka ini menunjukkan "apa yang harus dilakukan jika proses meminta membaca, menulis, dan operasi lainnya pada deskriptor file." . Bisakah Anda memperluas sedikit ini?
Geek

@Geek Entri dalam tabel deskriptor file bukan angka. Angka tersebut adalah indeks ke tabel itu.
Gilles 'SANGAT berhenti menjadi jahat'

@Giles, terima kasih telah menjelaskan kesalahpahaman saya. Saya mengerti lebih baik sekarang. Jadi bisakah Anda memberikan contoh bagian "apa yang harus dilakukan" dalam jawaban Anda. Saya mengumpulkan bahwa setiap entri dalam tabel deskriptor file lagi memiliki pointer ke tabel file yang berisi informasi seperti file offset, status file dll. Tetapi saya masih tidak jelas pada bagian "apa yang harus dilakukan" dalam jawaban Anda.
Geek

2

Nama file hanyalah nama file pada sistem file, tidak lebih - itu hanya string.

Deskriptor file adalah semacam objek, dari mana Anda dapat membaca dan / atau menulis. Itu adalah file yang dibuka dan siap. Tidak hanya deskriptor file - stdin, stdout dan stderr juga deskriptor, Anda dapat menulis dan membaca dari mereka menggunakan fungsi yang sama persis dengan file (kecuali Anda tidak dapat misalnya mencari). Contoh deskriptor lain yang bukan file adalah: pipa bernama dan soket jaringan.

Dalam kode, deskriptor file adalah variabel, penunjuk ke sesuatu di kernel, yang mewakili objek file.

Sebagai contoh, / dev / fd / 0, / dev / stdin, / proc / self / fd / 0 adalah semua tautan ke / dev / pts / 2. Apakah keempat deskriptor file ini, atau nama file?

Ini semua adalah file pseudo, yang dapat berguna untuk beberapa skrip atau program. Anda dapat membukanya dan membuka () akan memberi Anda deskriptor file.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.