Apabila program meminta untuk membuka fail atau sumber data lain, seperti soket rangkaian - kernel sistem operasi memberikan akses, membuat entri dalam jadual fail global, dan menyediakan perisian dengan lokasi entri itu.
Deskriptor dikenal pasti oleh integer bukan negatif yang unik, seperti 0, 12, atau 567 . Sekurang-kurangnya satu deskriptor fail wujud untuk setiap fail terbuka pada sistem.
Deskriptor fail pertama kali digunakan dalam Unix, dan digunakan oleh sistem operasi moden termasuk Linux, macOS X, dan BSD. Di Microsoft Windows, deskriptor fail dikenali sebagai pemegang fail.
- Gambaran keseluruhan
- Stdin, stdout, dan stderr
- Mengarahkan deskriptor fail
Apabila proses membuat permintaan yang berjaya untuk membuka fail, kernel mengembalikan deskriptor fail yang menunjukkan entri dalam jadual fail global kernel. Entri jadual fail mengandungi maklumat seperti inode fail, offset byte, dan sekatan akses untuk aliran data tersebut (baca-baca, tulis sahaja, dsb.).
Stdin, stdout, dan stderr
Pada sistem operasi seperti Unix, tiga deskriptor fail pertama, secara lalai, adalah STDIN (input standard), STDOUT (output standard), dan STDERR (ralat standard).
Nama | Deskriptor fail | Penerangan | Singkatan |
---|---|---|---|
Input standard | 0 | Aliran data lalai untuk input, contohnya dalam peralihan arahan. Dalam terminal, ini lalai ke input papan kekunci dari pengguna. | stdin |
Output standard | 1 | Aliran data lalai untuk output, contohnya apabila arahan mencetak teks. Di terminal, ini lalai ke skrin pengguna. | stdout |
Kesalahan biasa | 2 | Aliran data lalai untuk keluaran yang berkaitan dengan ralat yang berlaku. Di terminal, ini lalai ke skrin pengguna. | stderr |
Mengarahkan deskriptor fail
Deskriptor fail boleh diakses secara langsung menggunakan bash, shell lalai Linux, macOS X, dan Windows Subsystem untuk Linux.
Contohnya, apabila anda menggunakan perintah cari, output berjaya pergi ke stdout (deskriptor fail 1 ), dan mesej ralat pergi ke stderr (deskriptor fail 2 ). Kedua-dua aliran dipaparkan sebagai output terminal:
cari / -name '* something *'
/ usr / share / doc / something / usr / share / doc / something / examples / find something_random: `/ run / udisks2 ': Permission denied find:` / run / wpa_supplicant': Permission denied / usr / share / something / usr / permainan / sesuatu
Kami mendapat ralat kerana mencari cuba mencari beberapa direktori sistem yang kami tidak mempunyai kebenaran untuk membaca. Semua baris yang mengatakan "Kebenaran dinafikan" telah ditulis untuk stderr, dan baris lain ditulis untuk stdout .
Anda boleh menyembunyikan stderr dengan mengarahkan deskriptor file 2 ke / dev / null, peranti khas di Linux yang "tidak pergi ke mana-mana":
cari / -name '* something *' 2> / dev / null
/ usr / share / doc / something / usr / share / doc / something / examples / something_random / usr / share / something / usr / games / something
Kesalahan telah dihantar ke / dev / null, dan tidak dipaparkan.
Memahami perbezaan antara stdout dan stderr adalah penting apabila anda mahu bekerja dengan output program. Contohnya, jika anda mencuba keluaran arahan mencari, anda akan melihat bahawa mesej ralat tidak ditapis, kerana hanya output standard yang disalurkan ke grep .
cari / -name '* something *' | grep 'something'
/ usr / share / doc / something / usr / share / doc / something / examples / find something_random: `/ run / udisks2 ': Permission denied find:` / run / wpa_supplicant': Permission denied / usr / share / something / usr / permainan / sesuatu
Walau bagaimanapun, anda boleh mengalihkan ralat standard kepada output standard, dan kemudian grep akan memproses teks kedua-duanya:
cari / -name '* something *' 2> & 1 | grep 'something'
/ usr / share / doc / something / usr / share / doc / something / examples / something_random / usr / share / something / usr / games / something
Perhatikan bahawa dalam arahan di atas, descriptor fail sasaran ( 1 ) diawali dengan ampersand (" & "). Untuk mendapatkan maklumat lanjut mengenai pengalihan aliran data, lihat saluran paip di shell bash.
Untuk contoh membuat dan menggunakan deskriptor fail dalam bash, lihat contoh arahan executin kami.
Pemegang fail, istilah Sistem Operasi