Ketika mencoba mengarahkan output program dengan sintaks "beberapa angka lebih besar dari" (mis. foo 2> myfile
), Berapa angka yang mungkin di sini dan apa yang mereka wakili?
Saya percaya 1 adalah /dev/stdout
, 2 adalah /dev/stderr
. Bagaimana dengan 5 & 6? Apakah ada angka 3, 4 atau lebih dari 6?
io-redirection
file-descriptors
fifo
Mahasiswa Fermat
sumber
sumber
Jawaban:
Seharusnya program ini akan menulis ke file nomor deskriptor yang Anda tentukan. pertimbangkan program hello world berikut:
kompilasi itu
sekarang jalankan sederhana
tidak ada file untuk 5, jadi tidak ada byte yang menulis.
percobaan berikutnya:
Saya berhasil mendapatkan output saat menentukan file dan deskriptor file (misalnya
5>u
).Dalam praktiknya, kecuali jika Anda telah menulis program lucu seperti di atas, Anda tidak akan mengumpulkan data menggunakan
5>foo
.dalam skrip shell, konstruk menggunakan <() lebih bermanfaat:
sumber
write()
kembalissize_t
, tidakint
.Angka-angka tersebut merupakan deskriptor file (pegangan ke file yang telah dibuka).
Shell biasanya memiliki 3 set secara otomatis,
0 - stdin 1 - stdout 2 - stderr
Tetapi file lebih lanjut dapat dibuka, dan jumlahnya bertambah.
sumber
Angka-angka itu adalah deskriptor file . Seperti yang Anda catat, ada beberapa yang dibuat secara otomatis. Ketika file lain atau hal-hal seperti file dibuka, mereka akan mendapatkan nomor lain.
Angka-angka yang digunakan dalam program tertentu tergantung pada file apa yang telah dibuka oleh program itu, atau digunakan. Misalnya, jika Anda ingin "menyimpan" stdin saat ini dan sementara mengalihkan stdin dari tempat lain kemudian mengembalikannya nanti, Anda bisa melakukan sesuatu seperti:
Jadi skrip ini akan memiliki
4
deskriptor file yang tersedia setidaknya untuk beberapa waktu. Angka 4 itu bisa berupa apa saja yang tidak digunakan (well, ada batas untuk berapa banyak file yang bisa dibuka oleh suatu proses, tetapi apa pun dalam batas itu).Anda dapat melihat file deskriptor apa yang telah dibuka oleh suatu proses, dan di mana mereka terbuka dengan melihatnya
/proc/<pid>/fd
. Itu menunjukkan semua deskriptor file terbuka untuk proses itu<pid>
dan file apa yang terkait dengannya.sumber
Setiap proses mendapatkan angka integer sebagai deskriptor file, di mana ada tiga yang dicadangkan di POSIX: 0 adalah stdin, 1 adalah stdout dan 2 adalah stderr. File lebih lanjut akan diberi nomor lebih lanjut. Anda dapat memeriksa dengan mudah dengan program ini, simpan sebagai fdtest.c , sehingga membuka kode program sendiri selama runtime:
Kompilasi:
Menjalankannya:
Output yang akan Anda dapatkan adalah sesuatu seperti ini:
... yang merupakan jumlah deskriptor file dari file yang dirujuk oleh variabel
fd
.sumber