Tentang pertanyaan kinerja Anda, pipa lebih efisien daripada file karena tidak diperlukan IO disk. Jadi cmd1 | cmd2
lebih efisien daripada cmd1 > tmpfile; cmd2 < tmpfile
(ini mungkin tidak benar jika tmpfile
didukung pada disk RAM atau perangkat memori lain sebagai bernama pipa; tetapi jika itu adalah pipa bernama, cmd1
harus dijalankan di latar belakang karena hasilnya dapat memblokir jika pipa menjadi penuh ). Jika Anda memerlukan hasil cmd1
dan masih perlu mengirimkan outputnya cmd2
, Anda harus cmd1 | tee tmpfile | cmd2
yang akan mengizinkan cmd1
dan cmd2
menjalankan secara paralel menghindari operasi pembacaan disk cmd2
.
Pipa Bernama berguna jika banyak proses membaca / menulis ke pipa yang sama. Mereka juga dapat berguna ketika suatu program tidak dirancang untuk menggunakan stdin / stdout karena IO-nya perlu menggunakan file . Saya meletakkan file dalam italic karena pipa bernama tidak persis file dalam sudut pandang penyimpanan karena mereka berada di memori dan memiliki ukuran buffer tetap, bahkan jika mereka memiliki entri sistem file (untuk tujuan referensi). Hal- hal lain dalam UNIX memiliki entri sistem file tanpa menjadi file: hanya memikirkan /dev/null
atau entri lain dalam /dev
atau /proc
.
Karena pipa (dinamai dan tidak bernama) memiliki ukuran buffer tetap, operasi baca / tulis dapat diblokir, menyebabkan proses baca / tulis masuk dalam status IOWait. Juga, kapan Anda menerima EOF saat membaca dari buffer memori? Aturan tentang perilaku ini didefinisikan dengan baik dan dapat ditemukan pada pria.
Satu hal yang tidak dapat Anda lakukan dengan pipa (bernama dan tidak disebutkan namanya) adalah mencari kembali dalam data. Karena mereka diimplementasikan menggunakan buffer memori, ini bisa dimengerti.
Tentang "everything in Linux/Unix is a file"
, saya tidak setuju. Pipa bernama memiliki entri sistem file, tetapi tidak benar-benar file. Pipa yang tidak disebutkan namanya tidak memiliki entri sistem file (kecuali mungkin dalam /proc
). Namun, sebagian besar operasi IO pada UNIX dilakukan dengan menggunakan fungsi baca / tulis yang memerlukan deskriptor file , termasuk pipa tanpa nama (dan soket). Saya tidak berpikir kita bisa mengatakan itu "everything in Linux/Unix is a file"
, tetapi kita pasti bisa mengatakan itu "most IO in Linux/Unix is done using a file descriptor"
.