[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: [CPROG] Eksekvere kommando og læse output



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


 
Home   Subscribe   Mail Archive   Index   Calendar   Search

 
 
Questions about the web-pages to <www_admin>. Last modified 2005-08-10, 20:08 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] *