Apa umur dari deskriptor file?

11

Seperti dijelaskan di sini , pengalihan digunakan open()untuk menulis ke file. Ada deskriptor file dalam (?) Yang dibuat di shell, dan kemudian digunakan saat dibutuhkan.

Apakah deskriptor dalam dibuat untuk seluruh durasi naskah atau masa pakai shell? Apakah dihancurkan setelah beberapa waktu, sejumlah operasi, dll?

Maksud saya khususnya deskriptor file untuk file yang dibuka oleh shell itu sendiri untuk operasi bawaannya. Apakah deskriptor dibuat dan file dibuka untuk setiap operasi? Berapa lama mereka disimpan? Contoh:

#!/bin/bash
>>x echo something
...do many other things not related to the file x
>>x echo something more

Apakah instance deskriptor pertama disimpan hingga operasi kedua?

Bagaimana dengan shell yang saya gunakan di terminal? Saya terkadang membuka satu sesi selama berhari-hari, bahkan mungkin berminggu-minggu. Apakah masih menyimpan deskriptor untuk semua file yang saya operasikan dengan built-in shell?

Jeff Schaller
sumber

Jawaban:

4

Secara singkat: Shell hampir pasti akan menutup deskriptor file yang terkait dengan pengalihan segera setelah perintah selesai.


Detail: Tidak ada penyebutan eksplisit tentang penutupan file yang dibuka melalui pengalihan di POSIX (sejauh yang saya bisa lihat). Tetapi tidak segera menutupnya tidak akan sangat berguna.

The aturan untuk lingkungan setiap perintah yang dimulai pada tidak memungkinkan untuk melewati file deskriptor ekstra. Shell perlu berhati-hati untuk menutup fd ekstra apa pun yang disimpan ketika memulai perintah yang seharusnya tidak memilikinya.

Untuk > filenameredirection output yang biasa , file harus dalam kasus harus dipotong ketika memulai setiap perintah, bahkan jika deskriptor file disimpan. Dan setiap deskriptor file yang disimpan akan menunjuk ke file yang salah jika file yang bersangkutan diganti namanya atau dihapus sementara itu.

Misalnya, ini tidak akan berlaku dengan benar jika fd yang dibuka untuk yang pertama echotetap terbuka dan digunakan apa adanya untuk yang kedua:

echo foo >> x; mv x y; echo bar >> x

Model fork + exec yang biasa digunakan untuk memulai program eksternal juga membuatnya sangat mudah untuk menutup file secara otomatis ketika perintah keluar. Shell hanya perlu fork()terlebih dahulu, dan buka file yang diperlukan dalam proses anak, sebelum memanggil exec()untuk mengganti anak dengan perintah yang sebenarnya. Ketika proses anak keluar, semua file yang dibuka olehnya secara otomatis ditutup.


Dalamawk , meskipun, sintaks untuk output redirection mirip dengan shell, tetapi setiap file yang dibuka tetap terbuka sampai keluar naskah, kecuali secara eksplisit ditutup. Ini hanya akan terbuka foosekali, dan tidak akan memotongnya di antara cetakan baik:

awk 'BEGIN { print "a" > "foo"; print "b" > "foo" }'
ilkkachu
sumber
6

Mereka ditutup ketika selesai dengan. Shell akan membuat 3 file deskriptor 0,1,2 untuk setiap perintah yang dijalankan. Ini hanya angka, jumlahnya digunakan kembali. Shell akan menutup file sebelum menggunakan kembali deskriptor.

Deskriptor file juga diteruskan ke proses lain. Dan jika Anda memiliki proses di latar belakang itu masih akan memiliki file deskriptor.

Contoh menggunakan 3>&1, ini berarti membuat file deskriptor 3 merujuk ke file yang merujuk deskriptor 1 saat ini.

ctrl-alt-delor
sumber