Mengapa pengalihan file ke dan dari nama pipa tidak berfungsi, tetapi pemipaan ke kucing tidak?

8

Ini adalah server gema sederhana di Unix, menggunakan nc:

mkfifo fifo
cat fifo | nc -k -l 4458 -v | cat >fifo

(berdasarkan ini )

Seperti yang saya lihat, aliran data berfungsi sebagai berikut:

fifo (my named pipe)
 |
 | (using cat)
 |
 v
nc
 |
 | (using cat)
 |
 v
fifo 

Dan inilah pertanyaannya: mengapa ini tidak berhasil?

nc -k -l 4458 -v >fifo <fifo

Anda akan melihat bahwa jika Anda mencoba untuk telnetke localhostatas 4458Anda akan mendapatkan "Koneksi ditolak" kesalahan.

Razvan
sumber
Saya tidak punya jawaban tetapi mudah-mudahan ini bisa membantu seseorang yang lebih berpengetahuan daripada saya. cat myfifo | nc -k -l 4458 > myfifojuga berfungsi. Jika Anda menggunakan file teks, file.txt seperti itu nc -k -l 4458 < file.txt > file.txtKoneksi pertama akan menghubungkan dan menutup (masuk akal karena input terpotong dan EOF menutup soket), koneksi kedua akan menjadi server gema pelupa: itu akan menggema setiap baris lain dan simpan baris yang belum dikunci ke file teks.
user1794469

Jawaban:

9

Ini karena perintah netcat bahkan belum dimulai! Shell ketika mencoba membuka fifo untuk input akan diblokir. Mencoba

strace cat >fifo <fifo

dan Anda tidak akan melihat apa pun. Sebagai gantinya gunakan, misalnya,

nc -k -l 4458 -v <>fifo >&0

yang membuka fifo untuk membaca dan menulis sebagai stdin, dan kemudian menyalinnya ke stdout.


Menelusuri perintah bash penuh menunjukkan bahwa tidak terbuka untuk membaca atau menulis kembali (sampai terbuka berlawanan dilakukan):

$ strace -f -e open bash -c 'nc -k -l 4458 -v  >fifo <fifo'
...
Process 3631 attached
[pid  3631] open("fifo", O_WRONLY|O_CREAT|O_TRUNC, 0666

$ strace -f -e open bash -c 'nc -k -l 4458 -v  <fifo >fifo'
...
Process 3684 attached
[pid  3684] open("fifo", O_RDONLY

man 3 mkfifo: Membuka FIFO untuk membaca biasanya menghalangi sampai beberapa proses lain membuka FIFO yang sama untuk menulis, dan sebaliknya.

meuh
sumber
1
Pemblokiran ini didokumentasikan: tldp.org/LDP/lpg/node19.html
thrig
Mengapa shell memblokir ketika menggunakan "> fifo <fifo"? Tampaknya membuka untuk menulis dan kemudian untuk membaca. Jadi, karena sudah ada pegangan untuk menulis dibuka tidakkah seharusnya dilanjutkan secara normal?
Razvan
@ Razvan Saya telah memperbarui jawaban dengan strace sebenarnya untuk dua perintah alternatif dari fifo, dan Anda dapat melihatnya terbuka untuk menulis atau membaca kedua blok.
meuh