Saya baru mulai belajar bagaimana Everything Is A File TM di Linux, yang membuat saya bertanya-tanya apa yang akan terjadi jika saya benar-benar membaca dari / dev / stdout:
$ cat /dev/stdout
^C
$ tail /dev/stdout
^C
( ^C
Aku yang membunuh program setelah hang).
Ketika saya mencoba vim
, saya mendapatkan pesan yang tidak terpikirkan: "/ dev / stdout" bukan file. Terkesiap!
Jadi apa yang memberi, mengapa saya mendapatkan hangup atau pesan kesalahan ketika saya mencoba membaca "file" ini?
Jawaban:
Anda tidak mendapatkan "hangup" dari
cat(1)
dantail(1)
, itu hanya memblokir saat dibaca.cat(1)
menunggu input, dan mencetaknya segera setelah melihat garis lengkap:Di sini saya mengetik
foo
Enterbar
EnterCTRL- D.tail(1)
menunggu input, dan mencetaknya hanya ketika ia dapat mendeteksiEOF
:Di sini saya mengetik lagi
foo
Enterbar
EnterCTRL- D.Vim adalah satu-satunya yang memberi Anda kesalahan. Itu melakukan itu karena berjalan
stat(2)
melawan/dev/stdout
, dan menemukan itu tidak memilikiS_IFREG
set bit./dev/stdout
adalah file, tetapi bukan file biasa . Bahkan, ada beberapa tarian di kernel untuk memberikannya entri di sistem file. Di Linux:Di OpenBSD:
Di FreeBSD:
sumber
(Hampir) semuanya adalah file tetapi tidak semuanya adalah file biasa . Tidak masuk akal untuk memanggil editor teks pada sesuatu yang merupakan file khusus seperti direktori, soket jaringan, port serial, dll.
File
/dev/stdout
dapat menjadi salah satu dari beberapa hal tergantung pada varian unix:Dalam kasus apa pun, membuka
/dev/stdout
dan file-file serupa membuat deskriptor file baru yang dikaitkan dengan file yang sama yang sudah dibuka aplikasi pada deskriptor file 1. “Output standar” berarti deskriptor file 1, dan itu hanya konvensi bahwa deskriptor file ini digunakan untuk output - kernel tidak peduli.Ketika Anda menjalankan program di terminal, ketiga deskriptor standar (0 = input standar, 1 = output standar, 2 = standard error) dibuka pada perangkat terminal. Membaca dari perangkat itu mengembalikan karakter yang diketik oleh pengguna, dan menulis ke perangkat itu menampilkan teks di jendela terminal. (Tidak ada cara standar, diberikan perangkat terminal, untuk membaca output yang ditampilkan atau menyuntikkan input ke dalamnya.)
Ketika Anda menjalankan
cat /dev/stdout
, itu melakukan hal yang persis sama dengancat /dev/stdin
ataucat /dev/stderr
, karena ketiga penjelas file ini terhubung ke file yang sama: ia memberitahucat
untuk membaca dari terminal. Itulah yangcat
tanpa argumen juga.Jika Anda berlari
cat /dev/stdout >foo
, maka/dev/stdout
akan merujuk ke filefoo
- perintah itu setara dengancat foo >foo
. Bergantung padacat
implementasinya, mungkin kesalahan keluar (versi GNU mengeluh bahwa "file input adalah file output"), atau mungkin tidak melakukan apa-apa karena membaca dari filefoo
yang kosong (>foo
hanya terpotong). Dengan versicat
yang tidak mendeteksi kasus khusus ini, jikafoo
tidak kosong, makacat /dev/stdout >>foo
atau yang setaracat foo >>foo
akan menambahkan konten file ke dirinya sendiri tanpa batas.Ketika Anda menjalankan
vim /dev/stdout
, itu mengeluh karena tidak tahu cara mengedit terminal (itu tidak masuk akal).sumber
cat
dantail
sedang mencari konten opsional diikuti oleh akhir file./dev/stdout
tetap terbuka, jadicat
dantail
teruslah mencari.sumber