Apa itu deskriptor file, yang dijelaskan dalam istilah sederhana?

384
  1. Apa yang akan menjadi deskripsi yang lebih disederhanakan dari deskriptor file dibandingkan dengan Wikipedia? Mengapa mereka dituntut? Katakan, ambil proses shell sebagai contoh dan bagaimana penerapannya?

  2. Apakah tabel proses berisi lebih dari satu file descriptor. Jika ya, mengapa?

Nishant
sumber
3
Bagaimana dengan konsep stdin stdout stderr dll? Saya memiliki contoh seperti mengatakan proses browser dibuka dan telah membuka beberapa file sementara untuk menampilkan html saya. Prosesnya menggunakan fd yang sama untuk membaca / menulis? Juga tabel proses ....... ia memiliki entri seperti fd0 pointer fd1 pointer fd2 pointer ..... apakah itu berarti semua file ini dalam RAM? Kenapa lagi petunjuk?
Nishant
43
Saat Anda membuka file, OS membuat aliran ke file itu dan menghubungkan aliran itu ke file yang dibuka, deskriptor sebenarnya mewakili aliran itu. Demikian pula ada beberapa stream default yang dibuat oleh OS. Streaming ini terhubung ke terminal Anda, bukan file. Jadi ketika Anda menulis sesuatu di terminal ia pergi ke stdin stream dan OS. Dan ketika Anda menulis perintah "ls" di terminal, OS menulis output ke stdout stream. aliran stdout terhubung ke terminal monitor Anda sehingga Anda dapat melihat output di sana.
Tayyab
1
Mengenai contoh browser, tidak perlu bahwa browser membuat file dibuka. Itu tergantung pada implementasi browser tetapi dalam kebanyakan kasus browser membuka file sementara, menulis file, dan menutup file, jadi itu tidak perlu bahwa file dibuka bahkan jika halaman web terbuka. Dan deskriptor hanya menyimpan informasi file dan tidak selalu menyimpan file dalam RAM. Saat Anda membaca data dari deskriptor, OS membaca data dari hard-disk. Informasi dalam deskriptor file hanya mewakili lokasi file pada hard-disk dll.
Tayyab
5
Deskriptor file ke file bukan pemetaan satu ke satu. Saya bisa membuka () file yang sama 4 kali dan mendapatkan 4 deskriptor file yang berbeda. Masing-masing dapat digunakan (tergantung pada bendera yang dikirimkan ke tempat terbuka ()) untuk membaca, menulis atau keduanya. Sejauh apakah file tersebut hidup dalam RAM atau pada disk - ini disembunyikan dari Anda oleh kernel, dan berbagai cache. Pada akhirnya apa itu cache akan cocok dengan apa yang ada di disk (untuk menulis), dan kernel tidak akan kembali ke disk, untuk membaca, jika data sudah ada dalam cache.
Beano
7
Ini adalah artikel yang bagus untuk memahaminya dengan mudah bottomupcs.com/file_descriptors.xhtml
Krishan Gopal

Jawaban:

562

Dengan kata sederhana, ketika Anda membuka file, sistem operasi membuat entri untuk mewakili file itu dan menyimpan informasi tentang file yang dibuka. Jadi jika ada 100 file dibuka di OS Anda maka akan ada 100 entri di OS (di suatu tempat di kernel). Entri-entri ini diwakili oleh bilangan bulat seperti (... 100, 101, 102 ....). Nomor entri ini adalah deskriptor file. Jadi itu hanya angka integer yang secara unik mewakili file yang dibuka di sistem operasi. Jika proses Anda membuka 10 file maka tabel Proses Anda akan memiliki 10 entri untuk deskriptor file.

Demikian pula ketika Anda membuka soket jaringan, itu juga diwakili oleh integer dan itu disebut Socket Descriptor. Saya harap Anda mengerti.

Tayyab
sumber
8
Juga, inilah mengapa Anda dapat kehabisan file deskriptor, jika Anda membuka banyak file sekaligus. Yang akan mencegah sistem * nix dari berjalan, karena mereka membuka deskriptor untuk hal-hal di /procsepanjang waktu.
Spencer Rathbun
8
@ ErbenMo: Tidak, mungkin tidak sama. Ketika Anda membuka file, sistem operasi akan menetapkan FD yang tersedia dan ketika Anda menutupnya maka OS melepaskan FD dan dapat menetapkan FD itu ke file lain yang dibuka setelah itu. Cara sistem operasinya untuk melacak File yang Dibuka dan tidak ada hubungannya dengan file tertentu.
Tayyab
49
" Jadi itu hanya nomor integer yang secara unik mewakili file yang dibuka di sistem operasi. " Ini tidak benar. Integer itu secara unik mewakili file yang dibuka dalam suatu proses . Deskriptor file 0, misalnya, akan mewakili satu file yang dibuka dalam satu proses dan file yang dibuka sama sekali berbeda dalam proses lain.
Keith Thompson
15
@Ayyab: Saya yakin Anda salah. Deskriptor file 0, 1, dan 2 adalah input standar, output standar, dan kesalahan standar untuk setiap proses yang berjalan. Panggilan awal yang berhasil open()akan memberi Anda file deskriptor 3, bahkan jika proses lain berjalan memiliki deskriptor file 3. Lihat definisi POSIX dariopen() : "Fungsi open () akan mengembalikan deskriptor file untuk file bernama yang terendah. deskriptor file saat ini tidak terbuka untuk proses itu . " (penekanan ditambahkan).
Keith Thompson
17
@KeithThompson: Ya Anda benar. Sebenarnya ini tentang tingkat abstraksi. Sebenarnya dua tabel dipertahankan, di mana yang pertama adalah per-proses dan yang kedua adalah sistem yang luas. FD dalam tabel per-proses (yaitu fdtable) bukan sistem unik lebar. Namun itu memetakan ke tabel v-node yang berisi entri unik lebar sistem. Jadi ketika Anda memanggil fopen () dan fileno () berfungsi untuk memeriksa deskriptor maka Anda bisa mendapatkan nomor FD yang sama dalam 2 proses berbeda karena mengembalikan indeks fdtable yang merupakan per-proses. Terima kasih telah membawanya !!
Tayyab
116

Deskriptor file adalah pegangan buram yang digunakan dalam antarmuka antara ruang pengguna dan kernel untuk mengidentifikasi sumber file / socket. Oleh karena itu, ketika Anda menggunakan open()atau socket()(panggilan sistem untuk antarmuka ke kernel), Anda diberi deskriptor file, yang merupakan integer (sebenarnya merupakan indeks ke dalam struktur proses u - tetapi itu tidak penting). Oleh karena itu, jika Anda ingin antarmuka langsung dengan kernel, menggunakan panggilan sistem ke read(), write(), close()dll pegangan Anda gunakan adalah file descriptor.

Ada lapisan abstraksi yang dihamparkan pada panggilan sistem, yang merupakan stdioantarmuka. Ini memberikan lebih banyak fungsi / fitur daripada panggilan sistem dasar. Untuk antarmuka ini, pegangan buram yang Anda dapatkan adalah FILE*, yang dikembalikan oleh fopen()panggilan. Ada banyak banyak fungsi yang menggunakan stdioantarmuka fprintf(), fscanf(), fclose(), yang ada untuk membuat hidup Anda lebih mudah. Dalam C, stdin, stdout, dan stderryang FILE*, yang pada UNIX masing-masing peta ke deskriptor file 0, 1dan 2.

Pesta
sumber
6
Saya pribadi berpikir bahwa jawaban ini lebih baik daripada yang ditandai sebagai jawaban. Terpilih.
Tarik
101

Dengarkan dari Mulut Kuda: APUE (Richard Stevens).
Untuk kernel, semua file yang terbuka dirujuk oleh File Descriptors. Deskriptor file adalah angka non-negatif.

Ketika kita membuka file yang sudah ada atau membuat file baru, kernel mengembalikan deskriptor file ke proses. Kernel mempertahankan tabel semua deskriptor file terbuka, yang sedang digunakan. Penjatahan deskriptor file umumnya berurutan dan dialokasikan untuk file sebagai deskriptor file gratis berikutnya dari kumpulan deskriptor file gratis. Ketika kami menutup file, deskriptor file akan dibebaskan dan tersedia untuk penjatahan lebih lanjut.
Lihat gambar ini untuk detail lebih lanjut:

Dua proses

Ketika kami ingin membaca atau menulis file, kami mengidentifikasi file dengan deskriptor file yang dikembalikan oleh open () atau create () function call, dan menggunakannya sebagai argumen untuk membaca () atau menulis () .
Dengan konvensi itulah, shell Sistem UNIX mengaitkan deskriptor file 0 dengan Input Standar suatu proses, deskriptor file 1 dengan Output Standar , dan deskriptor file 2 dengan Kesalahan Standar .
Deskriptor file berkisar dari 0 hingga OPEN_MAX. Nilai maksimal deskriptor file dapat diperoleh dengan ulimit -n. Untuk informasi lebih lanjut, buka bab 3 dari Buku APUE.

Shekhar Kumar
sumber
1
Karena 0, 1, 2 dikaitkan dengan "stdin", "stdout", dan "stderr" dari suatu proses, dapatkah kita menggunakan deskriptor tersebut secara bersamaan untuk proses yang berbeda?
Tarik
@Arik: deskriptor file adalah per proses. Untuk melihat ini, unduh osquery dan jalankan osqueryi <<< echo '.all process_open_files'di bash shell.
Ben Creasy
29

Jawaban lain menambahkan hal-hal hebat. Saya akan menambahkan 2 sen saja.

Menurut Wikipedia kita tahu pasti: deskriptor file adalah bilangan bulat non-negatif. Hal terpenting yang menurut saya hilang, adalah mengatakan:

Deskriptor file terikat ke ID proses.

Kita tahu deskriptor file paling terkenal adalah 0, 1 dan 2. 0 sesuai dengan STDIN, 1 hingga STDOUT, dan 2 hingga STDERR.

Katakan, ambil proses shell sebagai contoh dan bagaimana penerapannya?

Lihatlah kode ini

#>sleep 1000 &
[12] 14726

Kami membuat proses dengan id 14726 (PID). Dengan menggunakan lsof -p 14726kita bisa mendapatkan hal-hal seperti ini:

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
sleep   14726 root  cwd    DIR    8,1     4096 1201140 /home/x
sleep   14726 root  rtd    DIR    8,1     4096       2 /
sleep   14726 root  txt    REG    8,1    35000  786587 /bin/sleep
sleep   14726 root  mem    REG    8,1 11864720 1186503 /usr/lib/locale/locale-archive
sleep   14726 root  mem    REG    8,1  2030544  137184 /lib/x86_64-linux-gnu/libc-2.27.so
sleep   14726 root  mem    REG    8,1   170960  137156 /lib/x86_64-linux-gnu/ld-2.27.so
sleep   14726 root    0u   CHR  136,6      0t0       9 /dev/pts/6
sleep   14726 root    1u   CHR  136,6      0t0       9 /dev/pts/6
sleep   14726 root    2u   CHR  136,6      0t0       9 /dev/pts/6

Kolom FD 4 dan kolom TYPE berikutnya berhubungan dengan File Descriptor dan tipe File Descriptor.

Beberapa nilai untuk FD dapat:

cwd – Current Working Directory
txt – Text file
mem – Memory mapped file
mmap – Memory mapped device

Tetapi deskriptor file asli berada di bawah:

NUMBER – Represent the actual file descriptor. 

Karakter setelah angka yaitu "1u", mewakili mode di mana file dibuka. r untuk membaca, w untuk menulis, u untuk membaca dan menulis.

TYPE menentukan jenis file. Beberapa nilai TYPE adalah:

REG – Regular File
DIR – Directory
FIFO – First In First Out

Tetapi semua deskriptor file adalah CHR - File karakter khusus (atau file karakter perangkat)

Sekarang, kita dapat mengidentifikasi Penjelas File untuk STDIN, STDOUTdan STDERRmudah dengan lsof -p PID, atau kita dapat melihat sama jika kita ls /proc/PID/fd.

Perhatikan juga bahwa tabel deskriptor file yang dicatat oleh kernel tidak sama dengan tabel file atau tabel inode. Ini terpisah, seperti yang dijelaskan beberapa jawaban lainnya.

tabel fd

Anda dapat bertanya pada diri sendiri di mana deskriptor file ini secara fisik dan apa yang disimpan /dev/pts/6misalnya

sleep   14726 root    0u   CHR  136,6      0t0       9 /dev/pts/6
sleep   14726 root    1u   CHR  136,6      0t0       9 /dev/pts/6
sleep   14726 root    2u   CHR  136,6      0t0       9 /dev/pts/6

Ya, /dev/pts/6hidup murni dalam ingatan. Ini bukan file biasa, tetapi disebut file perangkat karakter . Anda dapat memeriksa ini dengan: ls -l /dev/pts/6dan mereka akan mulai dengan c, dalam kasus saya crw--w----.

Untuk mengingat sebagian besar Linux seperti OS, tentukan tujuh jenis file:

  • File biasa
  • Direktori
  • File perangkat karakter
  • Blokir file perangkat
  • Soket domain lokal
  • Named pipes (FIFOs) dan
  • Tautan simbolik
prosti
sumber
1
Terima kasih. Memang penting untuk menunjukkan bahwa itu adalah per proses! Ini membantu untuk memvisualisasikan hal-hal yang lebih baik.
Nishant
1
Jenis file yang ditentukan oleh OS, yang telah Anda sebutkan dalam jawaban Anda, sangat membantu dalam memahami file pada level yang lebih rendah.
Rohan Bhale
20

Lebih banyak poin tentang File Descriptor:

  1. File Descriptors(FD) adalah bilangan bulat non-negatif (0, 1, 2, ...)yang terkait dengan file yang dibuka.

  2. 0, 1, 2adalah FD standar yang sesuai dengan STDIN_FILENO, STDOUT_FILENOdan STDERR_FILENO(didefinisikan dalam unistd.h) dibuka secara default atas nama shell ketika program dimulai.

  3. FD dialokasikan dalam urutan berurutan, yang berarti nilai integer unallocated serendah mungkin.

  4. FD untuk proses tertentu dapat dilihat di /proc/$pid/fd(pada sistem berbasis Unix).

Sandeep_black
sumber
16

Sebagai tambahan untuk jawaban lain, unix menganggap semuanya sebagai sistem file. Keyboard Anda adalah file yang hanya dapat dibaca dari perspektif kernel. Layar adalah file tulis saja. Demikian pula, folder, perangkat input-output dll juga dianggap sebagai file. Setiap kali file dibuka, katakan ketika driver perangkat [untuk file perangkat] meminta open (), atau suatu proses membuka file pengguna, kernel mengalokasikan deskriptor file, integer yang menentukan akses ke file tersebut sehingga hanya dibaca , tulis saja dll. [untuk referensi: https://en.wikipedia.org/wiki/Everything_is_a_file ]

Balu
sumber
Deskriptor file juga dapat merujuk pada hal-hal yang tidak ada dalam sistem file, seperti pipa anonim dan soket jaringan.
kbolino
12

File Descriptors (FD):

  • Di Linux / Unix , semuanya adalah file. File biasa, Direktori, dan bahkan Perangkat adalah file. Setiap File memiliki nomor terkait yang disebut File Descriptor (FD).
  • Layar Anda juga memiliki File Descriptor. Ketika sebuah program dieksekusi, output dikirim ke File Descriptor di layar, dan Anda melihat output program di monitor Anda. Jika output dikirim ke File Descriptor pada printer, output program akan dicetak.

    Pengalihan Kesalahan:
    Setiap kali Anda menjalankan program / perintah di terminal, 3 file selalu terbuka
    1. input standar
    2. output standar
    3. kesalahan standar.

    File-file ini selalu ada setiap kali program dijalankan. Seperti yang dijelaskan sebelum deskriptor file, dikaitkan dengan masing-masing file ini.
    File                                        File Deskriptor
    Input Standar STDIN 0
    Output Standar STDOUT 1
    Kesalahan Standar STDERR 2

  • Misalnya, saat mencari file, seseorang biasanya mendapat izin yang ditolak kesalahannya atau beberapa jenis kesalahan lainnya. Kesalahan ini dapat disimpan ke file tertentu.
    Contoh 1

$ ls mydir 2> errorsfile.txt

Deskripsi file untuk kesalahan standar adalah 2.
Jika tidak ada direktori bernama mydir maka output dari perintah akan disimpan ke file errorfile.txt
Dengan menggunakan "2>" kami mengarahkan kembali output kesalahan ke file bernama "errorfile. txt "
Dengan demikian, keluaran program tidak berantakan dengan kesalahan.

Saya harap Anda mendapat jawaban Anda.

Abhishek Kamal
sumber
5

Setiap sistem operasi memiliki proses (p) yang berjalan, katakanlah p1, p2, p3 dan sebagainya. Setiap proses biasanya membuat penggunaan file yang berkelanjutan.

Setiap proses terdiri dari pohon proses (atau tabel proses, dalam ungkapan lain).

Biasanya, sistem Operasi mewakili setiap file dalam setiap proses dengan angka (yaitu, dalam setiap pohon proses / tabel).

File pertama yang digunakan dalam proses ini adalah file0 , kedua adalah file1 , ketiga adalah file2 , dan sebagainya.

Nomor tersebut adalah deskriptor file.

Deskriptor file biasanya bilangan bulat (0, 1, 2 dan bukan 0,5, 1,5, 2,5).

Mengingat kita sering menggambarkan proses sebagai "tabel proses", dan mengingat bahwa tabel memiliki baris (entri) kita dapat mengatakan bahwa file deskriptor sel di setiap entri, digunakan untuk mewakili seluruh entri.

Dengan cara yang sama, ketika Anda membuka soket jaringan, ia memiliki deskriptor soket.

Dalam beberapa sistem operasi, Anda dapat kehabisan deskriptor file, tetapi kasus seperti itu sangat jarang, dan rata-rata pengguna komputer tidak perlu khawatir karenanya.

Deskriptor file mungkin bersifat global (proses A dimulai pada katakan 0, dan berakhir mengatakan dalam 1; Proses B mulai mengatakan dalam 2, dan berakhir mengatakan dalam 3) dan seterusnya, tetapi sejauh yang saya tahu, biasanya dalam sistem operasi modern, file deskriptor tidak global, dan sebenarnya proses-spesifik (proses A dimulai pada katakan 0 dan berakhir mengatakan dalam 5, sedangkan proses B dimulai pada 0 dan berakhir mengatakan dalam 10).


sumber
Baca lebih lanjut tentang FD di Linux di sini: unix.stackexchange.com/questions/358022/…
1
jawaban yang bagus :)
humble_wolf
5

Penjelas file

  • Untuk Kernel semua file yang terbuka disebut oleh deskriptor file.
  • Deskriptor file adalah bilangan bulat non-negatif.
  • Ketika kita membuka file yang sudah ada atau membuat file baru, kernel mengembalikan deskriptor file ke suatu proses.
  • Ketika kami ingin membaca atau menulis pada file, kami mengidentifikasi file dengan deskriptor file yang dikembalikan oleh terbuka atau buat, sebagai argumen untuk membaca atau menulis.
  • Setiap proses UNIX memiliki 20 deskriptor file dan pembuangannya, bernomor 0 hingga 19 tetapi diperluas hingga 63 oleh banyak sistem.
  • Tiga yang pertama sudah dibuka ketika proses dimulai 0: Input standar 1: Output standar 2: Output kesalahan standar
  • Ketika proses induk memotong suatu proses, proses anak mewarisi deskriptor file induk
Mahendra suthar
sumber
1

Tambahan di atas semua tanggapan disederhanakan.
Jika Anda bekerja dengan file dalam skrip bash, lebih baik menggunakan deskriptor file.
Misalnya: -
Anda ingin membaca dan menulis dari / ke file "test.txt".
Gunakan deskriptor file seperti yang ditunjukkan di bawah ini

FILE=$1 # give the name of file in the command line
exec 5<>$FILE # '5' here act as the file descriptor
# Reading from the file line by line using file descriptor
while read LINE; do
    echo "$LINE"
done <&5

# Writing to the file using descriptor
echo "Adding the date: `date`" >&5 
exec 5<&- # Closing a file descriptor
sumitsinghdeode
sumber
-5

File Deskriptor adalah deskriptor file. Mereka memberi tautan ke suatu file. Dengan bantuan mereka, kita dapat membaca, menulis, dan membuka file.

Motimahal
sumber