Di halaman ini dari Desain dan Implementasi Sistem Operasi 4.4BSD , dikatakan bahwa:
Perbedaan utama antara pipa dan soket adalah bahwa pipa memerlukan proses induk yang sama untuk mengatur saluran komunikasi
Namun, jika saya merekam dengan benar, satu-satunya cara untuk membuat proses baru adalah dengan fork
yang sudah ada. Jadi saya tidak dapat benar-benar melihat bagaimana 2 proses tidak dapat memiliki leluhur yang sama. Apakah saya kemudian benar untuk berpikir bahwa setiap proses dapat disalurkan satu sama lain?
ps auxf
gagasan tentang leluhur proses.Jawaban:
Tidak juga.
Pipa-pipa tersebut harus dipasang oleh proses induk sebelum anak atau anak-anak bercabang dua. Setelah proses anak bercabang-cabang, deskriptor file tidak dapat dimanipulasi "dari luar" (mengabaikan hal-hal seperti debuggers), orang tua (atau proses lainnya) tidak dapat melakukan bagian "mengatur saluran comms." Setelah fakta .
Jadi jika Anda mengambil dua proses acak yang sudah berjalan, Anda tidak dapat mengatur pipa di antara mereka secara langsung. Anda perlu menggunakan beberapa bentuk soket (atau mekanisme IPC lain) untuk membuat mereka berkomunikasi. (Tetapi perhatikan bahwa beberapa sistem operasi, FreeBSD di antaranya, memungkinkan Anda mengirim deskriptor file pada soket Unix-domain.)
sumber
Kalimat itu tidak begitu jelas. Pertama, orang tua harus leluhur , karena proses pemasangan pipa dapat menjadi orangtua, atau kakek nenek, atau kakek nenek ..., kakek nenek, atau salah satu proses komunikasi. Kedua, kalimat itu tidak berarti "jika Anda menginginkan pipa, harus ada proses leluhur yang sama", tetapi "jika Anda menginginkan pipa, proses leluhur yang sama harus mengaturnya".
Di bawah kap mesin, proses membuat pipa dengan sendirinya. Pipa adalah deskriptor file seperti yang lain, atau lebih tepatnya sepasang deskriptor file, satu untuk setiap akhir. Proses yang menciptakan pipa dapat menggunakannya segera untuk mengirim data ke dirinya sendiri, meskipun ini jarang berguna (meskipun pipa-sendiri memang ada gunanya).
Ungkapan tipikal adalah untuk proses mengatur pipa, kemudian bercabang proses anak, dan menutup salah satu ujung pipa di induk dan ujung lain pipa di anak. Ini memungkinkan orang tua dan proses anak berkomunikasi dalam satu arah. Jika proses memerlukan komunikasi dua arah, mereka membutuhkan dua pipa (kecuali pada beberapa varian unix di mana pipa dua arah).
Pipa-pipa tersebut diwarisi secara bergiliran oleh anak-anak, sehingga proses yang menciptakan pipa mungkin tidak terlibat dalam komunikasi. Misalnya, pipa di shell yang dibuat antara dua perintah eksternal seperti
ls | rot13
melibatkan langkah-langkah berikut:execve
padals
.execve
padarot13
.Jika dua proses yang ada ingin berkomunikasi satu sama lain, mereka dapat menggunakan pipa bernama . (Yah, ada juga file deskriptor yang lewat , tapi itu bukan untuk yang lemah hati.)
sumber
Shell pipa adalah induk yang membentuk saluran komunikasi antara beberapa anggota pipa.
Setiap proses dapat disalurkan ke yang lain. Satu-satunya proses yang berguna dapat disalurkan bersama adalah "filter" yang membaca dari stdin dan menulis ke stdout.
Misalnya, jika Anda mengeluarkan perintah
ps -eaH
akan menunjukkan bahwa kucing dan dua ekornya adalah anak-anak dari cangkang pemohon:sumber