2013-06-14 13 views
6

Czy jest lepszy sposób to zrobić?Uzyskaj dane wyjściowe polecenia systemowego w programie C

Nie chcę tworzyć pliku pośrednika, a następnie go usunąć.

EDIT:

Tu nie chodzi o czytanie z pliku. Polecenie może brzmieć "ls" lub "echo" Hello world "

+1

to kod C. Chciałem powiedzieć C++, ale potem zauważyłem PLIK *. – Dennis

+1

Zamieniłem tag java na c, ponieważ kod znajduje się w c. – AlexR

+0

możliwy duplikat [Jak mogę uruchomić zewnętrzny program z C i przeanalizować jego wyjście?] (Http://stackoverflow.com/questions/43116/how-can-i-run-an-external-program-from-c i przeanalizuj jego wyjście) – GSerg

Odpowiedz

16

Ok, byłem zmieszany w mojej drugiej odpowiedzi. W każdym razie filozofia w tej odpowiedzi jest taka sama. Możesz użyć bezpośrednio funkcji popen.

Wtedy masz coś takiego:

int numOfCPU; 
FILE *fp = popen("grep -c ^processor /proc/cpuinfo", "r"); 

fscanf(fp, "%d", &numOfCPU); 
pclose(fp); 

Mam nadzieję, że będzie użyteczny.

4

Musisz użyć przekierowania i potoków, aby zrobić to, co próbujesz zrobić.

Zadzwoń pod numer , ale jeśli potrzebujesz czegoś bardziej elastycznego, np. Przekierowującego dane wejściowe lub bardziej bezpiecznego, np. Nie uruchamiającego łańcucha w powłoce, powinieneś wykonać ten przykład, biorąc od manualna strona potoku.

#include <sys/wait.h> 
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <unistd.h> 
    #include <string.h> 

    int 
    main(int argc, char *argv[]) 
    { 
     int pipefd[2]; 
     pid_t cpid; 
     char buf; 

     if (argc != 2) { 
     fprintf(stderr, "Usage: %s <string>\n", argv[0]); 
     exit(EXIT_FAILURE); 
     } 
     if (pipe(pipefd) == -1) { 
      perror("pipe"); 
      exit(EXIT_FAILURE); 
     } 

     cpid = fork(); 
     if (cpid == -1) { 
      perror("fork"); 
      exit(EXIT_FAILURE); 
     } 

     if (cpid == 0) { /* Child reads from pipe */ 
      close(pipefd[1]);   /* Close unused write end */ 

      while (read(pipefd[0], &buf, 1) > 0) 
       write(STDOUT_FILENO, &buf, 1); 

      write(STDOUT_FILENO, "\n", 1); 
      close(pipefd[0]); 
      _exit(EXIT_SUCCESS); 

     } else {   /* Parent writes argv[1] to pipe */ 
      close(pipefd[0]);   /* Close unused read end */ 
      write(pipefd[1], argv[1], strlen(argv[1])); 
      close(pipefd[1]);   /* Reader will see EOF */ 
      wait(NULL);    /* Wait for child */ 
      exit(EXIT_SUCCESS); 
     } 
    } 

Należy zmodyfikować proces dziecko do korzystania dup2 przekierować standardowe wyjście do rury i następnie exec polecenie, które chcesz go uruchomić.

-3

Stosując awk:

#include <stdlib.h> 
#include <stdio.h> 

void main() 
{ 
    int numOfCPU =0; 

    system ("awk '/processor/{numOfCPU++}END{print numOfCPU}' /proc/cpuinfo"); 
} 
+0

Czy ktoś może wyjaśnić, jak to działa? – tangrs

+5

Wątpię, że działa ... – user172818