[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



"Jonas Jensen" <sslug@sslug> wrote in message
news:sslug@sslug
> On Wed, 12 May 2004 11:15:38 +0200, Holger Bille wrote:
> > Er der en af jer, der har en _elegant_ ansi C rutine til at lave en exec
> > af et eksternt program, hvor man give et dataområde til stdin og få
> > udfyldt to dataområder til hhv stdout og stderr???
>
> Det kan, så vidt jeg ved, ikke gøres i ren ANSI C. Det kan gøres med
> POSIX udvidelserne.

Hvorfor ikke det?

> > Jeg har selv lavet nedenstående som jeg tror vil lave deadlock hvis ikke
> > system-pipes er store nok til at rumme data til de 3 data strømme.
>
> Ja, du vil få deadlocks. Du har tre (fire) muligheder:
>
> 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.

> 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?


> 3. Brug expect(1) eller libexpect(3).

Er det udvidelsen til TCL?

> 4. Fortæl lidt mere om hvad dit praktiske problem er, måske kan det
> løses mere elegant end disse hacks.

Se punkt 1


Tak for input!

Holger Bille




 
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] *