Saya agak bingung dengan tujuan dari ketiga file ini. Jika pemahaman saya benar, stdin
adalah file di mana suatu program menulis permintaannya untuk menjalankan tugas dalam proses, stdout
adalah file yang digunakan kernel untuk menulis outputnya dan proses yang dimintanya mengakses informasi dari, dan stderr
merupakan file ke dalam dimana semua pengecualian dimasukkan. Saat membuka file-file ini untuk memeriksa apakah ini benar-benar terjadi, saya menemukan tidak ada yang menyarankan begitu!
Apa yang ingin saya ketahui adalah apa sebenarnya tujuan dari file-file ini, benar-benar membodohi jawaban dengan jargon teknologi yang sangat sedikit!
Jawaban:
Input standar - ini adalah pegangan file yang dibaca proses Anda untuk mendapatkan informasi dari Anda.
Output standar - proses Anda menulis informasi normal ke pegangan file ini.
Kesalahan standar - proses Anda menulis informasi kesalahan ke pegangan file ini.
Itu hampir sama bodohnya dengan yang saya bisa lakukan :-)
Tentu saja, itu kebanyakan berdasarkan konvensi. Tidak ada yang menghentikan Anda dari menulis informasi kesalahan Anda ke output standar jika Anda mau. Anda bahkan dapat menutup ketiga pegangan file sepenuhnya dan membuka file Anda sendiri untuk I / O.
Ketika proses Anda dimulai, itu seharusnya sudah memiliki pegangan ini terbuka dan itu hanya bisa membaca dari dan / atau menulis kepada mereka.
Secara default, mereka mungkin terhubung ke perangkat terminal Anda (misalnya,
/dev/tty
) tetapi shell akan memungkinkan Anda untuk mengatur koneksi antara ini menangani dan file tertentu dan / atau perangkat (atau bahkan pipa ke proses lain) sebelum proses Anda dimulai (beberapa dari manipulasi yang mungkin agak pintar).Contohnya adalah:
yang mana akan:
my_prog
.inputfile
sebagai input standar Anda (pegangan file 0).errorfile
sebagai kesalahan standar Anda (pegangan file 2).grep
.my_prog
ke input standargrep
.Berikan komentar Anda:
Itu karena mereka bukan file normal. Sementara UNIX menyajikan semuanya sebagai file dalam sistem file di suatu tempat, itu tidak membuatnya jadi pada level terendah. Sebagian besar file dalam
/dev
hierarki adalah perangkat karakter atau blokir, yang secara efektif merupakan driver perangkat. Mereka tidak memiliki ukuran tetapi mereka memiliki nomor perangkat utama dan kecil.Saat Anda membukanya, Anda terhubung ke driver perangkat daripada file fisik, dan driver perangkat cukup pintar untuk mengetahui bahwa proses terpisah harus ditangani secara terpisah.
Hal yang sama berlaku untuk sistem
/proc
file Linux . Itu bukan file asli, hanya gateway yang dikontrol ketat untuk informasi kernel.sumber
xyz >xyz.out
akan menulis output standar Anda ke file fisik yang dapat dibaca oleh proses lain.xyz | grep something
akan menghubungkanxyz
stdout kegrep
stdin lebih langsung. Jika Anda ingin akses tanpa batas ke proses yang tidak Anda kontrol dengan cara itu, Anda perlu melihat sesuatu seperti/proc
atau menulis kode untuk memfilter output dengan cara menghubungkannya ke kernel. Mungkin ada solusi lain tetapi mereka semua mungkin sama berbahayanya dengan yang lain :-)/dev/stdin
ini adalah symlink ke/proc/self/fd/0
- deskriptor file pertama yang dibuka oleh program yang sedang berjalan. Jadi, apa yang ditunjukkan oleh/dev/stdin
akan berubah dari program ke program, karena/proc/self/
selalu menunjuk ke 'program yang sedang berjalan'. (Program mana pun yang melakukanopen
panggilan.)/dev/stdin
Dan teman-teman diletakkan di sana untuk membuat skrip shell setuid lebih aman, dan memungkinkan Anda meneruskan nama file/dev/stdin
ke program yang hanya bekerja dengan file, tetapi Anda ingin mengontrol lebih interaktif. (Suatu hari nanti ini akan menjadi trik yang berguna untuk Anda ketahui. :)Akan lebih benar untuk mengatakan bahwa
stdin
,stdout
, danstderr
adalah "I / O stream" bukan file. Seperti yang Anda perhatikan, entitas ini tidak hidup di sistem file. Tetapi filosofi Unix, sejauh menyangkut I / O, adalah "semuanya adalah file". Dalam praktiknya, itu benar-benar berarti bahwa Anda dapat menggunakan fungsi dan antarmuka pustaka yang sama (printf
,scanf
,read
,write
,select
, dll) tanpa perlu khawatir apakah aliran I / O terhubung ke keyboard, file disk, socket, pipa, atau abstraksi I / O lainnya.Kebanyakan program perlu membaca input, menulis output, dan kesalahan log, sehingga
stdin
,stdout
, danstderr
yang telah ditetapkan untuk Anda, sebagai kenyamanan pemrograman. Ini hanya konvensi, dan tidak diberlakukan oleh sistem operasi.sumber
Sebagai pelengkap dari jawaban di atas, berikut adalah ringkasan tentang Pengalihan:
EDIT: Grafik ini tidak sepenuhnya benar tetapi saya tidak yakin mengapa ...
Grafik mengatakan 2> & 1 memiliki efek yang sama dengan &>
sumber
Saya khawatir pengertian Anda sepenuhnya mundur. :)
Pikirkan "standar dalam", "keluar standar", dan "kesalahan standar" dari perspektif program , bukan dari perspektif kernel.
Ketika suatu program perlu mencetak keluaran, biasanya ia mencetak ke "out standar". Suatu program biasanya mencetak output ke standar dengan
printf
, yang mencetak HANYA ke standar keluar.Ketika suatu program perlu mencetak informasi kesalahan (tidak harus pengecualian, itu adalah konstruksi bahasa pemrograman, dikenakan pada tingkat yang jauh lebih tinggi), itu biasanya dicetak ke "kesalahan standar". Ini biasanya dilakukan dengan
fprintf
, yang menerima aliran file untuk digunakan saat mencetak. Aliran file dapat berupa file apa saja yang dibuka untuk ditulis: standar keluar, kesalahan standar, atau file lain apa pun yang telah dibuka denganfopen
ataufdopen
."standar dalam" digunakan ketika file perlu membaca input, menggunakan
fread
ataufgets
, ataugetchar
.File-file ini dapat dengan mudah dialihkan dari shell, seperti ini:
Atau, seluruh enchilada:
Ada dua peringatan penting: Pertama, "standar dalam", "standar keluar", dan "kesalahan standar" hanyalah sebuah konvensi. Mereka adalah konvensi yang sangat kuat , tetapi itu semua hanya kesepakatan bahwa sangat bagus untuk dapat menjalankan program seperti ini:
grep echo /etc/services | awk '{print $2;}' | sort
dan memiliki output standar dari setiap program yang terhubung ke input standar dari program berikutnya di dalam pipa.Kedua, saya telah memberikan fungsi standar ISO C untuk bekerja dengan aliran file (
FILE *
objek) - pada level kernel, semuanya adalah deskriptor file (int
referensi ke tabel file) dan banyak operasi level yang lebih rendah sepertiread
danwrite
, yang tidak lakukan penyanggaan senang fungsi ISO C. Saya pikir untuk membuatnya tetap sederhana dan menggunakan fungsi yang lebih mudah, tapi saya pikir semua yang sama Anda harus tahu alternatifnya. :)sumber
stdin
Membaca input melalui konsol (mis. Input Keyboard). Digunakan dalam C dengan scanf
stdout
Menghasilkan output ke konsol. Digunakan dalam C dengan printf
stderr
Menghasilkan output 'error' ke konsol. Digunakan dalam C dengan fprintf
Pengalihan
Sumber untuk stdin dapat dialihkan. Misalnya, alih-alih berasal dari input keyboard, ini dapat berasal dari file (
echo < file.txt
), atau program lain (ps | grep <userid>
).Tujuan untuk stdout, stderr juga dapat diarahkan. Misalnya stdout dapat diarahkan ke file:,
ls . > ls-output.txt
dalam hal ini output ditulis ke filels-output.txt
. Stderr dapat dialihkan dengan2>
.sumber
Saya pikir orang-orang mengatakan
stderr
hanya boleh digunakan untuk pesan kesalahan menyesatkan.Ini juga harus digunakan untuk pesan informatif yang dimaksudkan untuk pengguna yang menjalankan perintah dan bukan untuk konsumen hilir potensial dari data (yaitu jika Anda menjalankan pipa shell chaining beberapa perintah Anda tidak ingin pesan informatif seperti "mendapatkan item 30 dari 42424 "muncul
stdout
karena mereka akan membingungkan konsumen, tetapi Anda mungkin masih ingin pengguna melihatnya.Lihat ini untuk alasan historis:
sumber
Menggunakan ps -aux mengungkapkan proses saat ini, yang semuanya terdaftar di / proc / as / proc / (pid) /, dengan memanggil cat / proc / (pid) / fd / 0 itu mencetak apa pun yang ditemukan dalam output standar dari proses itu saya pikir. Jadi mungkin,
/ proc / (pid) / fd / 0 - File Output Standar
/ proc / (pid) / fd / 1 - File Input Standar
/ proc / (pid) / fd / 2 - File Kesalahan Standar
sebagai contoh
Tetapi hanya bekerja dengan baik untuk / bin / bash proses lain umumnya tidak ada dalam 0 tetapi banyak kesalahan ditulis dalam 2
sumber
Untuk informasi otoritatif tentang file-file ini, periksa halaman manual, jalankan perintah pada terminal Anda.
Tetapi untuk jawaban sederhana, setiap file adalah untuk:
stdout untuk streaming
stdin untuk input aliran
stderr untuk kesalahan pencetakan atau pesan log.
Setiap program unix memiliki masing-masing aliran tersebut.
sumber
stderr tidak akan melakukan buffering IO Cache jadi jika aplikasi kita perlu mencetak info pesan penting (beberapa kesalahan, pengecualian) untuk menghibur atau file menggunakannya di mana seperti menggunakan stdout untuk mencetak info log umum karena menggunakan buffering IO Cache ada kemungkinan bahwa sebelum menulis pesan kami ke aplikasi file mungkin ditutup, meninggalkan kompleks debugging
sumber
File dengan buffering terkait disebut stream dan dinyatakan sebagai pointer ke jenis FILE yang ditentukan. Fungsi fopen () membuat data deskriptif tertentu untuk streaming dan mengembalikan pointer untuk menunjuk aliran dalam semua transaksi lebih lanjut. Biasanya ada tiga stream terbuka dengan pointer konstan yang dideklarasikan di header dan dikaitkan dengan file open standar. Pada startup program tiga aliran sudah ditentukan sebelumnya dan tidak perlu dibuka secara eksplisit: input standar (untuk membaca input konvensional), output standar (untuk menulis output konvensional), dan standard error (untuk menulis output diagnostik). Ketika dibuka, aliran kesalahan standar tidak sepenuhnya buffer; input standar dan output stream standar sepenuhnya buffered jika dan hanya jika aliran dapat ditentukan untuk tidak merujuk ke perangkat interaktif
https://www.mkssoftware.com/docs/man5/stdio.5.asp
sumber