Bisakah saya menyalurkan dua proses satu sama lain?

8

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 forkyang 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?

qdii
sumber
1
Jika pertanyaan Anda benar-benar tentang "leluhur yang sama", itu bukan yang dikatakan oleh kutipan Anda. Orang tua adalah leluhur, tetapi tidak semua leluhur adalah orangtua.
msw
lihatlah ps auxfgagasan tentang leluhur proses.
michas
@ msw maksud Anda, 2 proses harus memiliki orang tua langsung yang sama? menjadi sepupu (yaitu memiliki kakek nenek yang sama) tidak cukup?
qdii

Jawaban:

7

Apakah saya kemudian benar untuk berpikir bahwa setiap proses dapat disalurkan satu sama lain?

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.)

Tikar
sumber
4

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 | rot13melibatkan langkah-langkah berikut:

  • Shell membuat pipa.
  • Shell melakukan proses. Anak menutup akhir membaca pipa dan panggilan execvepada ls.
  • Shell melakukan proses. Anak menutup tulis ujung pipa dan panggilan execvepada rot13.
  • Shell menutup kedua ujung pipa dan menunggu kedua proses untuk keluar.

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.)

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2

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

$ tail -f /etc/motd | tail -f | cat > /dev/null

ps -eaH akan menunjukkan bahwa kucing dan dua ekornya adalah anak-anak dari cangkang pemohon:

 1675 pts/0    00:00:00     bash
 2483 pts/0    00:00:00       tail
 2484 pts/0    00:00:00       tail
 2485 pts/0    00:00:00       cat
msw
sumber