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?
Apakah tabel proses berisi lebih dari satu file descriptor. Jika ya, mengapa?
unix
operating-system
file-descriptor
Nishant
sumber
sumber
Jawaban:
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.
sumber
/proc
sepanjang waktu.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).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()
atausocket()
(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 keread()
,write()
,close()
dll pegangan Anda gunakan adalah file descriptor.Ada lapisan abstraksi yang dihamparkan pada panggilan sistem, yang merupakan
stdio
antarmuka. Ini memberikan lebih banyak fungsi / fitur daripada panggilan sistem dasar. Untuk antarmuka ini, pegangan buram yang Anda dapatkan adalahFILE*
, yang dikembalikan olehfopen()
panggilan. Ada banyak banyak fungsi yang menggunakanstdio
antarmukafprintf()
,fscanf()
,fclose()
, yang ada untuk membuat hidup Anda lebih mudah. Dalam C,stdin
,stdout
, danstderr
yangFILE*
, yang pada UNIX masing-masing peta ke deskriptor file0
,1
dan2
.sumber
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:
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.sumber
osqueryi <<< echo '.all process_open_files'
di bash shell.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 hinggaSTDOUT
, dan 2 hinggaSTDERR
.Lihatlah kode ini
Kami membuat proses dengan id 14726 (PID). Dengan menggunakan
lsof -p 14726
kita bisa mendapatkan hal-hal seperti ini:Kolom FD 4 dan kolom TYPE berikutnya berhubungan dengan File Descriptor dan tipe File Descriptor.
Beberapa nilai untuk FD dapat:
Tetapi deskriptor file asli berada di bawah:
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:
Tetapi semua deskriptor file adalah CHR - File karakter khusus (atau file karakter perangkat)
Sekarang, kita dapat mengidentifikasi Penjelas File untuk
STDIN
,STDOUT
danSTDERR
mudah denganlsof -p PID
, atau kita dapat melihat sama jika kitals /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.
Anda dapat bertanya pada diri sendiri di mana deskriptor file ini secara fisik dan apa yang disimpan
/dev/pts/6
misalnyaYa,
/dev/pts/6
hidup murni dalam ingatan. Ini bukan file biasa, tetapi disebut file perangkat karakter . Anda dapat memeriksa ini dengan:ls -l /dev/pts/6
dan mereka akan mulai denganc
, dalam kasus sayacrw--w----
.Untuk mengingat sebagian besar Linux seperti OS, tentukan tujuh jenis file:
sumber
Lebih banyak poin tentang
File Descriptor
:File Descriptors
(FD) adalah bilangan bulat non-negatif(0, 1, 2, ...)
yang terkait dengan file yang dibuka.0, 1, 2
adalah FD standar yang sesuai denganSTDIN_FILENO
,STDOUT_FILENO
danSTDERR_FILENO
(didefinisikan dalamunistd.h
) dibuka secara default atas nama shell ketika program dimulai.FD dialokasikan dalam urutan berurutan, yang berarti nilai integer unallocated serendah mungkin.
FD untuk proses tertentu dapat dilihat di
/proc/$pid/fd
(pada sistem berbasis Unix).sumber
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 ]
sumber
File Descriptors (FD):
Pengalihan Kesalahan:
Setiap kali Anda menjalankan program / perintah di terminal, 3 file selalu terbuka
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
Contoh 1
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.
sumber
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
Penjelas file
sumber
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
sumber
File Deskriptor adalah deskriptor file. Mereka memberi tautan ke suatu file. Dengan bantuan mereka, kita dapat membaca, menulis, dan membuka file.
sumber