2010-02-14 2 views
4

가능한 중복 :
How can I run an external program from C and parse its output?시스템에서 결과를() 캡처하는 방법에 C/C++

안녕하세요,

사람이 어떻게 할 때 결과를 캡처하는 방법 알려 주 시겠어요 system() 함수를 실행하고 있습니까?

실제로 "ipdisp"라고 불리는 컴퓨터의 IP 주소를 표시하는 C++ 프로그램을 작성했으며 서버 프로그램이이 ipdisp 프로그램을 실행하면 서버가 디스플레이 IP 주소를 캡처합니다. 그래서, 이것이 가능한가? 그렇다면 어떻게? 귀하의 답변

+0

많은 시간을 물었습니다. 한 가지 예 : http://stackoverflow.com/questions/43116/how-can-i-run-an-external-program-from-c-and-parse-its-output – dmckee

+0

죄송합니다. 질문을 썼다, 나는 관련 질문을 보지 않았다. 감사! – make

답변

6

예,이 작업을 수행 할 수 있지만이 system()을 사용할 수 없습니다에 대한

덕분에, 당신은 대신 popen()을 사용해야합니다. 다음과 같이 입력하십시오 :

FILE *f = popen("ipdisp", "r"); 
while (!feof(f)) { 
    // ... read lines from f using regular stdio functions 
} 
pclose(f); 
+0

많은 감사합니다! 제발 분명히하시기 바랍니다. 표시되는 변수는 다음과 같습니다. (char * xx1;) 어떻게 xx1을 얻을 수 있습니까? 다시 한 번 감사드립니다! – make

+0

'ipdisp'이 출력을 stdout에 쓴다고 가정하면 위의'f '파일을 통해 stdout을 읽을 수 있습니다. 'fgets' 또는 유사한 것을 사용하십시오. –

+0

감사합니다! 실제로 나는 두 개의 변수를 가지고 있습니다 : hostname과 ipaddress 그리고 나는 ipaddress를 캡쳐하고 싶습니다. stdout은 마지막으로 표시된 것을 취합니다? 다시 한 번 감사합니다 – make

1

그렉은 완전히 정확하지 않습니다. 당신은 시스템을 사용할 수 있지만, 정말 나쁜 생각입니다. 명령의 출력을 임시 파일에 기록한 다음 파일을 읽음으로써 시스템을 사용할 수 있지만 popen()은 훨씬 더 나은 방법입니다. 예를 들면 :

 
#include <stdlib.h> 
#include <stdio.h> 
void 
die(char *msg) { 
    perror(msg); 
    exit(EXIT_FAILURE); 
} 

int 
main(void) 
{ 
    size_t len; 
    FILE *f; 
    int c; 
    char *buf; 
    char *cmd = "echo foo"; 
    char *path = "/tmp/output"; /* Should really use mkstemp() */ 

    len = (size_t) snprintf(buf, 0, "%s > %s", cmd, path) + 1; 
    buf = malloc(len); 
    if(buf == NULL) die("malloc"); 
    snprintf(buf, len, "%s > %s", cmd, path); 
    if(system(buf)) die(buf); 
    f = fopen(path, "r"); 
    if(f == NULL) die(path); 
    printf("output of command: %s\n", buf); 
    while((c = getc(f)) != EOF) 
     fputc(c, stdout); 
    return EXIT_SUCCESS; 
} 

파일 시스템에서 파일을 떠나 이러한 접근 방식에 문제가 많은 ... (리디렉션에 대한 구문의 휴대 성, 임시 파일을 읽는 다른 프로세스와 보안 문제가 있습니다, 등, 등)

관련 문제