Apakah Deskriptor Fail?

Deskriptor fail adalah nombor yang unik mengenal pasti fail terbuka dalam sistem pengendalian komputer. Ia menerangkan sumber data, dan bagaimana sumber itu dapat diakses.

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).

NamaDeskriptor failPeneranganSingkatan
Input standard0Aliran data lalai untuk input, contohnya dalam peralihan arahan. Dalam terminal, ini lalai ke input papan kekunci dari pengguna.stdin
Output standard1Aliran data lalai untuk output, contohnya apabila arahan mencetak teks. Di terminal, ini lalai ke skrin pengguna.stdout
Kesalahan biasa2Aliran 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