[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 Mon, 6 Mar 2000 16:28:04 +0100, Danni Finne <sslug@sslug> wrote: > Ja, det er mig igen :) > > Kan I give et lille eksempel på hvordan jeg laver et c program der > eksekverer f.eks. ls og læser i outputtet fra ls ? Jeg går ud fra du er ret ny i dette, så her er et eksempel med lidt forklaringer: #define SIZE 100 char buff[SIZE+1]; int bytesread; int main(void) { // Først laver vi en pipe til at læse output fra ls. int pfd[2]; pipe(pfd); // Vi laver en child med fork til at udføre ls. if (fork() > 0) { // parent læser ls fra descripteren pfd[0], og skal ikke // bruge (skrive til) pfd[1]. close(pfd[1]); // Læs output indtil der eof og skriv det ud på skærmen. while(bytesread=read(pfd[0], (void*) buff, SIZE)) { buff[bytesread]='\0'; printf("%s",buff); } close(pfd[0]); } else { // child skriver til pfd[1] og skal ikke læse fra pfd[0] close(pfd[0]); // Med dup2 kopierer vi descriptoeren over i vores pfd[1] // og lukker den oprindelige stdout. dup2(pfd[1], 1); close(pfd[1]); // Nu hvor vi har "fanget" stdout loader vi ls. execlp("ls", "ls", (char *) 0); } } Dette er ET EKSEMPEL. Hvis du skal bruge det i det virkelige liv, skal du have noget fejlhåndtering på. Specielt skal du nok checke output fra pipe og fork. Hvis du benytter andet end ls, som fx. netværksforbindelser bør du læse med en timeout. Dette gøres med select. Hvis du bruger en 2.2 kærne kan du bruge poll i stedet - den er mere effektiv og mindre belastende for systemet. Jeg håber det var hvad du søgte. -- Most kind regards, Kristian Bjoernskov, <mailto:sslug@sslug> Novo Nordisk IT, Network - internet. Phone: +45 4442 3299. Fax: +45 4442 6061
![]() |
![]() |
![]() |
||||||||||||
|
||||||||||||||
![]() | ||||||||||||||
|
||||||||||||||
![]() |
![]() |
![]() |