🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.tcl
Article #183

Re: Potok

#183
From: Maciej Sobczak
Date: Mon, 03 Oct 2005 15:04
66 lines
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!news
References: <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