Saya mengerti deskriptor file (atau file handler) adalah teknik file IO dalam sistem Linux.
Saya juga tahu bahwa setiap proses memiliki 3 stream standar (yaitu stdin, stdout dan stderr) yang diwakili oleh file dengan deskriptor dari 0 hingga 3.
Namun, saya perhatikan bahwa semua proses yang saya teliti lsof -p <pid>
memiliki deskriptor file tambahan 255
dengan izin baca.
Dari jawaban ini , saya mengetahui bahwa fitur ini khusus untuk Bash shell , namun jawaban dan sumber yang direferensikan tidak benar-benar menjelaskan untuk apa deskriptor file ini.
Pertanyaan saya:
- Untuk apa 255 deskriptor file?
- Bisakah saya memanfaatkannya dalam skrip Bash saya atau hanya mekanisme kerja internal yang tidak seharusnya digunakan / dimanipulasi secara manual?
bash
file-descriptors
Tran Triet
sumber
sumber
Jawaban:
Untuk bagian terakhir dari pertanyaan Anda:
bisakah saya menggunakannya?
Dari
man bash
:Jadi, jika Anda maksud menggunakan sebagai membuat fd baru dengan nomor itu jawabannya adalah tidak.
Jika maksud Anda gunakan sebagai: "tulis ke fd itu":
Atau untuk membacanya:
jawabannya iya.
Tetapi, mungkin, itu harus lebih baik (tidak tergantung dari shell) untuk digunakan
/dev/tty
untuk mengaksestty
.untuk apa file descriptor 255?
Sebagai koneksi alternatif ke tty dalam kasus fd 1 (
/dev/stdout
) dan fd 0 (/dev/stdin
) diblokir.Lebih detail .
Kerang lain mungkin menggunakan nomor yang berbeda (seperti 10 dalam zsh)
Dari daftar surat :
sumber
dd bs=1 | bash -i -c 'sleep .1; ls -l /proc/$$/fd' 2>/tmp/err | tee /tmp/out
. Juga, komentar dari milis adalah tentang kapanbash
dijalankan sebagaibash scriptfile
(255
dalam hal ini pegangan terbuka untukscriptfile
- dan dalam hal itu,ls -l /proc/pid/fd
akan mencetak dengan sangat meyakinkan255 -> scriptfile
;-)), bukan tentang kapan itu dijalankan secara interaktif./dev/tty
, bukan dari fd 0 atau fd 1 c) jika fds 0, 1 atau 2 "diblokir", bash tidak akan menggunakan 255 fd sebagai alternatif untuk membaca input dari pengguna atau untuk menulis output perintah, prompt, pesan kesalahan, dll.Itu
255
file descriptor adalah pegangan terbuka untuk tty mengendalikan dan hanya digunakan ketikabash
dijalankan dalam modus interaktif.Ini memungkinkan Anda untuk mengarahkan ulang
stderr
di shell utama, sambil tetap memungkinkan kontrol pekerjaan berfungsi (mis. Dapat mematikan proses dengan ^ C, mengganggu mereka dengan ^ Z, dll).Contoh:
Jika Anda mencobanya di shell like
ksh93
, yang hanya menggunakan file deskriptor 2 sebagai referensi ke terminal pengendali,sleep
prosesnya akan kebal terhadap ^ C dan ^ Z, dan harus terbunuh dari jendela / sesi lain. Itu karena shell tidak akan dapat mengatur grup prosessleep
sebagai latar depan di terminaltcsetgrp()
, karena file deskriptor 2 tidak lagi menunjuk ke terminal.Ini tidak
bash
spesifik, ini juga digunakan dalamdash
danzsh
, hanya bahwa deskriptor tidak dipindahkan setinggi itu (biasanya 10).zsh
juga akan menggunakan fd itu untuk mengulang permintaan dan input pengguna, jadi cukup yang berikut ini akan berfungsi:Ini tidak ada hubungannya dengan menangani file
bash
menggunakan ketika membaca skrip dan mengatur pipa (yang juga ditipu keluar dari jalan dengan fungsi yang sama -move_to_high_fd()
), seperti yang disarankan dalam jawaban dan komentar lain.bash
menggunakan jumlah yang sedemikian besar untuk memungkinkan fds lebih besar daripada yang9
digunakan dengan pengalihan in-shell (mis.exec 87<filename
); itu tidak didukung di shell lain.Anda dapat menggunakan file itu menangani sendiri, tetapi ada gunanya melakukannya, karena Anda bisa mendapatkan pegangan ke terminal pengendali yang sama di setiap perintah
... < /dev/tty
.Analisis kode sumber bash :
Dalam
bash
, deskriptor file dari terminal pengendali disimpan dalamshell_tty
variabel. Jika shell bersifat interaktif, variabel tersebut diinisialisasi (pada saat startup atau setelah eksekutif yang gagal) masukjobs.c:initialize_job_control()
dengan dup'ing daristderr
(jikastderr
terpasang ke terminal) atau dengan langsung membuka/dev/tty
, dan kemudian ditiru lagi ke fd yang lebih tinggi dengangeneral.c:move_to_high_fd()
:Jika
shell_tty
tty belum mengendalikan, maka dibuat demikian:shell_tty
kemudian digunakan untukmendapatkan dan mengatur kelompok proses latar depan dengan
tc[sg]etpgrp
dijobs.c:maybe_give_terminal_to()
,jobs.c:set_job_control()
danjobs.c:give_terminal_to()
dapatkan dan atur
termios(3)
params dijobs.c:get_tty_state()
danjobs.c:set_tty_state()
dapatkan ukuran jendela terminal dengan
ioctl(TIOCGWINSZ)
inlib/sh/winsize.c:get_new_window_size()
.move_to_high_fd()
umumnya digunakan dengan semua deskriptor file sementara yang digunakan olehbash
(file skrip, pipa, dll), dari sana kebingungan dalam sebagian besar komentar yang muncul secara jelas dalam pencarian google.Deskriptor file yang digunakan secara internal oleh
bash
, termasukshell_tty
semua diatur ke close-on-exec, sehingga mereka tidak akan bocor ke perintah.sumber