2013-06-14 36 views
6

Có cách nào tốt hơn để làm điều đó không?Nhận lệnh đầu ra của hệ thống trong chương trình C

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"); 

Tôi không muốn tạo tệp trung gian và sau đó xóa tệp đó.

CHỈNH SỬA:

Nó không phải là đọc từ tệp. Lệnh có thể là "ls" hoặc "echo" Hello world '"

+1

Đây là mã C. Đã định nói C++ nhưng sau đó tôi nhận thấy FILE *. – Dennis

+1

Tôi đã thay thế thẻ java thành c vì mã nằm trong c. – AlexR

+0

có thể trùng lặp của [Làm thế nào tôi có thể chạy một chương trình bên ngoài từ C và phân tích đầu ra của nó?] (Http://stackoverflow.com/questions/43116/how-can-i-run-an-external-program-from-c -and-parse-its-output) – GSerg

Trả lời

16

Ok, tôi đã nhầm lẫn trong câu trả lời khác của tôi. Trong mọi trường hợp, triết lý trong câu trả lời này là như nhau. Bạn có thể sử dụng trực tiếp chức năng popen.

Sau đó, bạn có một cái gì đó như thế này:

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

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

Tôi hy vọng nó sẽ hữu ích.

4

Bạn cần sử dụng chuyển hướng và đường ống để thực hiện những gì bạn đang cố gắng làm.

Gọi số popen có thể giúp bạn, nhưng nếu bạn muốn điều gì đó linh hoạt hơn, chẳng hạn như chuyển hướng đầu vào hoặc an toàn hơn, chẳng hạn như không chạy chuỗi trong trình bao, bạn nên làm theo ví dụ này, lấy từ trang hướng dẫn sử dụng ống.

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

Bạn nên sửa đổi quy trình con để sử dụng dup2 để chuyển hướng đầu ra tiêu chuẩn tới đường ống và sau đó thực thi lệnh bạn muốn chạy.

-3

Sử dụng awk:

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

void main() 
{ 
    int numOfCPU =0; 

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

Ai đó có thể giải thích cách thức hoạt động của nó? – tangrs

+5

Tôi nghi ngờ nó hoạt động ... – user172818

Các vấn đề liên quan