[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]![]() |
![]() |
![]() |
|||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
![]() |
![]() |
![]() |
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.
![]() |
![]() |
![]() |
||||||||||||
|
||||||||||||||
![]() | ||||||||||||||
|
||||||||||||||
![]() |
![]() |
![]() |