Misalkan saya punya dua program yang disebut ProgramA
dan ProgramB
. Saya ingin menjalankan keduanya secara bersamaan di Windows cmd interpreter. Tapi saya ingin StdOut
dari ProgramA
doyan ke StdIn
dari ProgramB
dan StdOut
dari ProgramB
doyan ke StdIn
dari ProgramA
.
Sesuatu seperti ini
________________ ________________ | | | | | StdIn (== ← === ← == (StdOut | | Program A | | Program B | | | | | | StdOut) == → === → ==) StdIn | | ________________ | | ________________ |
Apakah ada perintah untuk melakukan ini - beberapa cara untuk mencapai fungsi ini dari cmd?
windows
batch-file
redirection
stdout
stdin
DarthRubik
sumber
sumber
Jawaban:
Tidak hanya itu bisa dilakukan, itu bisa dilakukan dengan apa-apa selain file batch! :-)
Masalahnya dapat diselesaikan dengan menggunakan file sementara sebagai "pipa". Komunikasi dua arah memerlukan dua file "pipa".
Proses A membaca stdin dari "pipe1" dan menulis stdout ke "pipe2"
Proses B membaca stdin dari "pipe2" dan menulis stdout ke "pipe1"
Penting bahwa kedua file ada sebelum meluncurkan proses mana pun. File harus kosong di awal.
Jika file batch mencoba membaca dari file yang kebetulan berada di akhir saat ini, itu hanya mengembalikan apa-apa, dan file tetap terbuka. Jadi rutin readLine saya terus membaca hingga mendapat nilai yang tidak kosong.
Saya ingin dapat membaca dan menulis string kosong, jadi rutinitas writeLine saya menambahkan karakter tambahan yang strip readLine lepas.
Proses A saya mengontrol aliran. Ini memulai sesuatu dengan menulis 1 (pesan ke B), dan kemudian memasuki satu lingkaran dengan 10 iterasi di mana ia membaca nilai (pesan dari B), menambahkan 1, dan kemudian menulis hasilnya (pesan ke B). Akhirnya ia menunggu pesan terakhir dari B, dan kemudian menulis pesan "keluar" ke B dan keluar.
Proses B saya berada dalam loop tanpa syarat bersyarat yang membaca nilai (pesan dari A), menambahkan 10, dan kemudian menulis hasilnya (pesan ke A). Jika B pernah membaca pesan "keluar", maka itu segera berakhir.
Saya ingin menunjukkan bahwa komunikasi sepenuhnya sinkron, jadi saya memperkenalkan penundaan pada loop proses A dan B.
Perhatikan bahwa prosedur readLine dalam loop ketat yang terus-menerus menyalahgunakan CPU dan sistem file sambil menunggu input. Penundaan PING dapat ditambahkan ke loop, tetapi kemudian proses tidak akan responsif.
Saya menggunakan pipa sejati sebagai kemudahan untuk meluncurkan proses A dan B. Tetapi pipa itu tidak berfungsi karena tidak ada komunikasi yang melewatinya. Semua komunikasi adalah melalui file "pipa" sementara saya.
Saya bisa saja menggunakan START / B untuk meluncurkan proses, tetapi kemudian saya harus mendeteksi kapan keduanya berakhir sehingga saya tahu kapan harus menghapus file "pipa" sementara. Jauh lebih mudah menggunakan pipa.
Saya memilih untuk meletakkan semua kode dalam satu file - skrip master yang meluncurkan A dan B, serta kode untuk A dan B. Saya bisa menggunakan file skrip terpisah untuk setiap proses.
test.bat
--KELUARAN--
Hidup sedikit lebih mudah dengan bahasa tingkat yang lebih tinggi. Di bawah ini adalah contoh yang menggunakan VBScript untuk proses A dan B. Saya masih menggunakan batch untuk meluncurkan proses. Saya menggunakan metode yang sangat keren yang dijelaskan di Mungkinkah menanamkan dan mengeksekusi VBScript dalam file batch tanpa menggunakan file sementara? untuk menanamkan beberapa skrip VBS dalam skrip batch tunggal.
Dengan bahasa yang lebih tinggi seperti VBS, kita dapat menggunakan pipa normal untuk meneruskan info dari A ke B. Kita hanya perlu satu file "pipa" sementara untuk meneruskan info dari B kembali ke A. Karena kita sekarang memiliki pipa yang berfungsi, A proses tidak perlu mengirim pesan "berhenti" ke B. Proses B hanya loop sampai mencapai akhir file.
Memang menyenangkan memiliki akses ke fungsi tidur yang tepat di VBS. Ini memungkinkan saya untuk dengan mudah memperkenalkan penundaan singkat pada fungsi readLine untuk memberikan CPU istirahat.
Namun, ada satu kerutan di dalam readLIne. Pada awalnya saya mendapatkan kegagalan yang terputus-putus sampai saya menyadari bahwa kadang-kadang readLine akan mendeteksi informasi tersedia di stdin, dan akan segera mencoba membaca baris sebelum B memiliki kesempatan untuk menyelesaikan penulisan baris. Saya memecahkan masalah dengan memperkenalkan penundaan singkat antara tes akhir file dan membaca. Penundaan 5 msec tampaknya melakukan trik untuk saya, tetapi saya menggandakannya menjadi 10 msec hanya untuk berada di sisi yang aman. Sangat menarik bahwa batch tidak mengalami masalah ini. Kami membahas ini secara singkat (5 pos pendek) di http://www.dostips.com/forum/viewtopic.php?f=3&t=7078#p47432 .
Outputnya sama dengan solusi batch murni, kecuali baris "berhenti" akhir tidak ada.
sumber
Catatan- Dalam retrospeksi, membaca pertanyaan lagi, ini tidak melakukan apa yang diminta. Karena, sementara itu menghubungkan dua proses bersama-sama, (dengan cara yang menarik yang bahkan akan bekerja melalui jaringan!), Itu tidak menghubungkan dua arah.
Saya harap Anda mendapatkan beberapa jawaban untuk ini.
Inilah jawaban saya tetapi jangan menerimanya, tunggu jawaban lain, saya ingin sekali melihat beberapa jawaban lain.
Ini dilakukan dari cygwin. Dan menggunakan perintah 'nc' (yang pintar). 'Wc-l' hanya menghitung garis. Jadi saya menghubungkan apa pun dua perintah, dalam hal ini, gema dan wc, menggunakan nc.
Perintah di sebelah kiri dilakukan terlebih dahulu.
nc adalah perintah yang dapat a) membuat server, atau b) menghubungkan seperti perintah telnet dalam mode mentah, ke server. Saya menggunakan penggunaan 'a' di perintah kiri, dan penggunaan 'b' di perintah kanan.
Jadi nc duduk di sana mendengarkan menunggu input, dan kemudian akan mengirim input itu ke
wc -l
dan menghitung garis dan output jumlah baris yang dimasukkan.Saya kemudian menjalankan baris untuk mengulang beberapa teks dan mengirim mentah ke 127.0.0.1:123 yang merupakan server yang disebutkan.
Anda bisa menyalin perintah nc.exe dari cygwin dan coba gunakan itu dan file cygwin1.dll yang diperlukan di direktori yang sama. Atau Anda bisa melakukannya dari cygwin sendiri seperti saya. Saya tidak melihat nc.exe di gnuwin32. Mereka memiliki pencarian http://gnuwin32.sourceforge.net/ dan nc atau netcat tidak muncul. Tetapi Anda bisa mendapatkan cygwin https://cygwin.com/install.html
sumber
netstat -aon | find ":123"
untuk melihat bahwa perintah di sebelah kiri menciptakan serverwc
belakang keecho
perintah).nc -lp9999 | prog1 | prog2 | nc 127.0.0.1 9999
langkah-langkah mungkin perlu diambil untuk memastikan buffer memerah tepat waktuSatu peretasan (saya lebih suka tidak melakukan ini, tapi ini yang akan saya lakukan sekarang) adalah menulis aplikasi C # untuk melakukan ini untuk Anda. Saya belum menerapkan beberapa fitur utama dalam program ini (seperti benar-benar menggunakan argumen yang diberikan kepada saya), tapi ini dia:
Kemudian pada akhirnya, ketika program ini berfungsi penuh dan kode debug dihapus Anda akan menggunakannya seperti ini:
sumber