[an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive]
 
[an error occurred while processing this directive] [an error occurred while processing this directive]
Skåne Sjælland Linux User Group - http://www.sslug.dk Home   Subscribe   Mail Archive   Forum   Calendar   Search
MhonArc Date: [Date Prev] [Date Index] [Date Next]   Thread: [Date Prev] [Thread Index] [Date Next]   MhonArc
 

Re: [PROGRAMMERING] C rutine til exec + pipe til og fra



On Thu, 13 May 2004 21:26:27 +0200, Holger Bille wrote:
>> 1. Vær selv forfatteren af det eksterne program du prøver at styre, og
>> gør dets stdout unbuffered. Som du selv skriver har du dog stadig
>> problemer med at system pipes'ne ikke altid er store nok, og det bliver
>> du nødt til at løse ved at lave buffering i dit eget program og loope
>> omkring select() eller poll(). Denne løsning er næppe besværet værd.
> 
> Meningen med hele øvelsen er at jeg vil kunne køre et vilkårligt
> program. Fx "wc", "grep", "sort", "ifconfig" etc... Evt. et mix vha.
> pipes.

Hvis dit formål er helt generelt at kunne styre input/output fra et
vilkårligt program, er det jo egentlig bare expect(1) du prøver at
implementere. I så fald er der jo ingen grund til at opfinde hjulet igen.

>> 2. fork() dit eget program 2 eller 3 gange så du ender med at have én
>> proces der skriver data til det eksterne programs stdin og 1 eller 2
>> processer der læser fra dets stdout/stderr. Denne løsning er klart at
>> foretrække hvis den data du skal skrive til stdin ikke afhænger af
>> hvad programmet skriver på stdout.
> 
> Ja det er jo super nemt, men... hvordan får jeg så data tilbage til den
> oprindelige proces?

Når man fork()er, er begrebet "den oprindelige proces" jo lidt mudret.
Men du kan bare arrangere det sådan at parent processsen (den med samme
pid som du startede med) er den der læser dataen fra dit eksterne
utility, altså at den er sidste led i pipen writer|utility|reader.

Du har kun et problem hvis den data der skal sendes ind i utility'et
afhænger af hvad der kommer ud af det. For at løse de problemer der
opstår med buffering allokerer expect sine egne pty'er, og det ville du
nok også være nødt til.

>> 3. Brug expect(1) eller libexpect(3).
> 
> Er det udvidelsen til TCL?

libexpect(3) er både til TCL og C.

Hvis du har plads til Linux på dit indlejrede system, har du nok også
plads til libtcl.so, den fylder 660K på min Mandrakelinux og kan sikkert
gøres meget mindre ved at compile mod uClibc, vælge unødvendige features
fra, etc.



 
Home   Subscribe   Mail Archive   Index   Calendar   Search

 
 
Questions about the web-pages to <www_admin>. Last modified 2005-08-10, 22:43 CEST [an error occurred while processing this directive]
This page is maintained by [an error occurred while processing this directive]MHonArc [an error occurred while processing this directive] # [an error occurred while processing this directive] *