» »

komunikacija med konzolnimi programi

komunikacija med konzolnimi programi

mojca ::

Rada bi napisala skripto (najverjetneje v ruby-u ali perl-u), ki naj bi klicala nek konzolni program, s katerim bi se morala znati skripta pogovarjati. Rada bi torej v program vpisovala ukaze, brala rezultate, ki mi jih program vraca, in rezultatom primerno "sprasevala" dalje.

Butast primer za ponazoritev: moja skripta vprasa uporabnika za njegovo srecno stevilko (N), in ker sama ne zna racunati, klice kalkulator (recimo bc), ga vprasa za ostanek srecnega stevila pri deljenju s 13 (N%13); ce je odgovor 0, "bc" vprasa se za fakulteto stevila N (N!) in izpise slednjo na zaslon, sicer pa uporabniku vrne niz "oprosti, nisi rojen pod srecno zvezdo".

Obstajati mora trivialna resitev, ukaz ali dva, ampak jaz jih ne vem. Kaksen predlog? Hvala, Mojca

PS: to je psevdokoda zgornjega butastega opisa:


N = stdin.readinteger()
f = execute_program("bc")
f.writetoprogram("N%13")
temp = f.readresult()
if (temp == 0) {
   f.writetoprogram("N!")
   stdout.write(f.readresult)
} else {
   stdout.write("oprosti, nisi rojen pod srecno zvezdo")
}

Senitel ::

To narediš s pipe-i... Zdej v Pythonu je recimo en ukaz "popen", ki ti požene en konzolni proces in se prilepi na njegovo konzolo popen pa vrne stdin, stdout iz katerih potem ti pišeš in bereš. Poišči nekaj podobnega še v PHP-ju.

64202 ::

popen ni dovolj glede na psevdokodo, zahteva je po dvosmerni komunikaciji. Ta tehnika je znana pod imenom coprocess, tole je pa koda za perl:
Bidirectional Communication with Another Process
I am NaN, I am a free man!

mile ::

mojca ::

Najlepša hvala za link na CPAN-u in za splošen uvod v pajpanje na Borlandovi strani, ampak glede perla me malo skrbi tale komentar: The open2() and open3() functions are unlikely to work anywhere except on a Unix system or some other one purporting to be POSIX compliant.
Nesprejemljivo je, da program ne bi delal na windowsih.

V ruby-u sem poskušala naslednje:


IO.popen("bc","w") {|pipe| # oz. "w+" namesto "w"
   pipe.puts("3+5")
   puts pipe.gets
}


Če odprem samo z "w", vrne napako pri zadnjem stavku, ko hočem izpisati rezultat (program je odprt samo za pisanje, ne pa tudi za branje). Če "puts pipe.gets" zakomentiram, dela, ampak ne ustreza mojim zahtevam. "w+" ne dela. Kako delajo ostali programerji???

Še enkrat hvala za pomoč in nasvete,
Mojca

dr. Zgemba ::

S socketpairom bi moralo iti gladko tudi na WIN.
Poglej si perlipc in perlfunc manpage.
Pa celo poglavje v Camelbook je na to temo, vključno s primeri.

bugz116 ::

> Nesprejemljivo je, da program ne bi delal na windowsih.

Perlov open2 dela tudi na winsih.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Katero grafično kartico: 7870 vs 650 ti

Oddelek: Kaj kupiti
262926 (2512) Xserces
»

template skripta - PERL

Oddelek: Programiranje
91161 (936) ABX
»

[Python, Linux] Poganjanje skripte s crontab

Oddelek: Programiranje
71466 (1289) morbo
»

[ C++ ] Več programov naenkrat

Oddelek: Programiranje
12959 (854) OwcA
»

LCD dražu oči?

Oddelek: Pomoč in nasveti
342218 (1414) Azrael

Več podobnih tem