Saya telah mengutak-atik agar ini berfungsi untuk sementara waktu sekarang, jadi saya curiga ada semacam kesalahpahaman mendasar tentang bagaimana pipa bekerja adalah akar penyebab masalah saya.
Tujuan saya adalah untuk memulai koneksi TCP ke beberapa host jarak jauh melalui netcat
dan memiliki dua pipa bernama pada sistem file: satu yang proses dapat membaca dari untuk mendapatkan data yang masuk, dan yang lain proses yang dapat menulis ke yang berfungsi sebagai data keluar. Saat ini saya menggunakan konstruksi berikut:
mkfifo in
mkfifo out
cat out | netcat foo.bar.org 4000 > in &
Dari sini, saya ingin mengizinkan proses lain untuk membaca dan menulis ke / dari koneksi TCP terbuka ini. Haruskah ini "hanya bekerja", atau adakah alasan mengapa konstruk seperti ini tidak berhasil?
Apa yang tampaknya terjadi saat ini adalah bahwa saya dapat membaca dari out
tanpa masalah, tetapi ketika saya menulis ke in
saya mendapatkan output menyebutkan pipa yang rusak dan semua komunikasi berikutnya tampaknya mati. Pikiran?
(Terkait: Saya awalnya menggunakan:
netcat foo.bar.org 4000 < out > in &
tetapi menemukannya untuk memblokir menunggu input. Saya ingin tahu tentang ini juga, tetapi mungkin lebih baik dibahas dalam pertanyaan terpisah.)
write(stdout): Broken pipe
setelah (atau tidak lama) menulis keout
pipa.Saya juga menghadapi masalah ini. Masalah utamanya adalah
netcat
. Ini adalah alat yang hebat, tetapi menutup koneksi ketika salah satu dari input atau output file deskriptornya ditutup. Itu tidak melakukan apa-apa ketika server tidak mendengarkan dan keluar ketika rekan lain ditutup. Selama Anda mengatur server dengan benar dan menjaga deskriptor file Anda tetap terbuka, itu akan berfungsi. Sebagai contoh saya menguji skenario berikut dan itu bekerja dengan sangat baik: dalam pengaturan terminal server gema (saya atur seperti di bawah ini):sekarang di terminal lain atur koneksi fifo Anda ke server Anda:
cetak server apa pun yang mengirim kepada Anda (dan tetap jalankan, jika Anda menggunakan
in
fifo dalam aplikasi yang menutup salah satu ujungnya pada penghentiannya,netcat
tutup koneksi)dan di terminal yang sama:
sekarang apa pun yang Anda ketik akan dicetak lagi (setelah menekan Enter). Menutup perintah ini juga akan menutup koneksi.
sumber
netcat -t -l -p 4000 < loopFF | tee loopFF
tidak menyebabkan loop umpan balik yang tak terbatas dengan dirinya sendiri?netcat
akan menutup setiap kali salah satu koneksi jaringannya ditutup. Jika Anda menutup klien (yang mengirim string dan menerima string yang sama),netcat
server juga akan ditutup. Saya menulis kode server untuk diri saya sendiri dalam hal ini yang bercabang sendiri untuk menangani banyak klien dan menghubungkan kembali klien.Analisis Steven Monday terlihat bagus bagi saya:
cat
kembali setelah penulisan pertama Andaout
karena fifo-nyaempty
. Untuk menghindari itu, solusinya adalah menjaga proses dengan fifo dibuka dalam mode tulis, yang pertamacat
dalam contoh di bawah ini:(File out-pid adalah cara untuk menghentikan semuanya:.
kill -9 $(cat out-pid)
)Contoh lain di sini .
sumber