Article View: pl.comp.lang.tcl
Article #183Re: Potok
From: Maciej Sobczak
Date: Mon, 03 Oct 2005 15:04
Date: Mon, 03 Oct 2005 15:04
66 lines
2891 bytes
2891 bytes
Maciej Sobczak wrote: > Czy ktoś z grupowiczów może pomóc z potokiem read-write? > > Prosty test: > > set pipe [open "|cat" "r+"] > puts $pipe "Hello" > set line [gets $pipe] > puts $line > close $pipe > > > Otwieram potok z poleceniem cat (któro wypisuje na stdout to, co > przeczytało na stdin). Piszę do potoku i spodziewam się przeczytać to samo. > Efekt - program nic nie wypisuje i w ogóle nie kontaktuje (Linux). Bo kanał I/O jest buforowany. Wystarczyło zrobić flush zaraz po puts. Człowiek miewa różne zaćmienia. :) > Krok drugi: potok, w którym można nie tylko pisać do stdin dziecka, ale > też odczytać *osobno* jego stdout i stderr. OK, rozpracowane. Wrzucam tu, może się komuś przyda: Polecenie exec pozwala przekierowywać wszystkie kanały wywołanego programu w dowolne miejsca, również do kanałów, które już są dostępne w programie Tcl. Idea polega na tym, żeby najpierw zrobić sobie w programie trzy kanały i użyć je w przekierowaniu w uruchamianym programie (przy okazji robię też fconfigure, żeby nie trzeba było robić flush po każdym zapisie do potoku): # tworzymy sobie 3 sztuczne kanały I/O: set pipe_in [open "|cat" "r+"] fconfigure $pipe_in -buffering line set pipe_out [open "|cat" "r+"] set pipe_err [open "|cat" "r+"] # odpalamy zewnętrzny program: exec jakisprogram <@ $pipe_in >@ $pipe_out 2>@ $pipe_err & # piszemy do potoku: puts $pipe_in "Hello" # i czytamy co wypluł, *osobno* jego stdout i stderr # (oczywiście, te polecenia mogą blokować) set line_from_out [gets $pipe_out] set line_from_err [gets $pipe_err] # ... # finito (zakładamy, że program skończy się po otrzymaniu EOF): close $pipe_in close $pipe_out close $pipe_err Uwaga: ampersand na końcu exec jest potrzebny, żeby można było dalej działać równocześnie z uruchomionym właśnie programem. -- Maciej Sobczak : http://www.msobczak.com/ Programming : http://www.msobczak.com/prog/
Technical Details
Message-ID:
<dhrhao$36v$1@sunnews.cern.ch>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.nask.pl!news.germany.com!solnet.ch!solnet.ch!news-zh.switch.ch!switch.ch!cern.ch!newsReferences:
<dhrdo3$ogn$1@sunnews.cern.ch>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.nask.pl!news.germany.com!solnet.ch!solnet.ch!news-zh.switch.ch!switch.ch!cern.ch!news From: Maciej Sobczak <no.spam@no.spam.com> Newsgroups: pl.comp.lang.tcl Subject: Re: Potok Date: Mon, 03 Oct 2005 17:04:56 +0200 Organization: CERN - European Laboratory for Particle Physics Lines: 66 Message-ID: <dhrhao$36v$1@sunnews.cern.ch> References: <dhrdo3$ogn$1@sunnews.cern.ch> NNTP-Posting-Host: abpc10883.cern.ch Mime-Version: 1.0 X-Trace: sunnews.cern.ch 1128351896 3295 (None) 137.138.37.241 X-Complaints-To: news@sunnews.cern.ch User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20050922 Red Hat/1.7.12-1.1.3.2.SL3 X-Accept-Language: en-us, en In-Reply-To: <dhrdo3$ogn$1@sunnews.cern.ch> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit