2013-06-14 8 views
6

Gibt es einen besseren Weg, es zu tun?Erhalten Systemausgabe im C-Programm

int numOfCPU; 
system("grep -c ^processor /proc/cpuinfo >> /tmp/cpuinfo"); 
FILE *fp = fopen("/tmp/cpuinfo", "r"); 
fscanf(fp, "%d", &numOfCPU); 
fclose(fp); 
system("rm /tmp/cpuinfo"); 

Ich möchte keine Zwischendatei erstellen und dann entfernen.

EDIT:

Es geht nicht um aus der Datei zu lesen. Der Befehl kann sein "ls" oder "echo Hallo Welt"

+1

Dies ist C-Code. Ich wollte C++ sagen, aber dann habe ich FILE * bemerkt. – Dennis

+1

Ich ersetzte Java-Tag zu c, weil der Code in c ist. – AlexR

+0

möglich Duplikat von [Wie kann ich ein externes Programm von C ausführen und seine Ausgabe parsen?] (Http://stackoverflow.com/questions/43116/how-can-i-run-an-external-program-from-c -und-parse-its-output) – GSerg

Antwort

16

Ok, ich war in meiner anderen Antwort verwirrt. In jedem Fall ist die Philosophie in dieser Antwort die gleiche. Sie können direkt die popen Funktion verwenden.

Dann haben Sie etwas wie folgt aus:

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

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

Ich hoffe, dass es nützlich sein wird.

4

Sie müssen Umleitung und Rohre zu tun, was Sie versuchen zu tun.

Der popen Aufruf kann Ihnen helfen, aber wenn Sie etwas flexibler möchten, wie zum Beispiel die Weiterleitung von Eingaben, oder sicherer, z. B. keine Zeichenfolge in der Shell ausführen, sollten Sie diesem Beispiel folgen Handbuchseite des Rohres.

#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); 
     } 
    } 

Sie sollten das Kind Prozess ändern zu verwenden dup2 die Standardausgabe an das Rohr umgeleitet und dann exec den Befehl Sie es ausgeführt werden sollen.

-3

Mit awk:

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

void main() 
{ 
    int numOfCPU =0; 

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

Kann jemand erklären, wie das funktioniert? – tangrs

+5

Ich bezweifle, dass es funktioniert ... – user172818

Verwandte Themen