2017-12-20 3 views
2

파이썬 :c 또는 C++에 subprocess.getoutput()과 같은 함수 또는 메서드가 있습니까?

printf("Active Device:%s",getsystemoutput("ip link|grep \"state UP\"|cut -d : -f 2|cut -d \' \' -f2")); 
+1

당신이 관심이 있습니까? C 또는 C++? 이들은 다른 언어입니다. –

+1

C에서 명령 출력을 수동으로 읽어야합니다. 'popen() '을 찾으십시오. –

+0

C++에서 나는 이런 종류의 일을하는 방법이있는 Boost :: Process를 볼 것을 추천합니다. –

답변

0

처럼 보일 수있는 함수 getsystemoutput()은 다음과 같습니다 :

char *getsystemoutput(char *cmd) 
{ 
    static char output[1024]; 

    FILE *fp; 

    if((fp = popen(cmd, "r")) == NULL) 
     return ""; 

    if(fgets(outout, sizeof output, fp) == NULL) 
     strcpy(output, ""); 

    pclose(fp); 
    return output; 
} 

print("Active Device:"+subprocess.getoutput("ip link|grep \"state UP\"|cut -d : -f 2|cut -d \' \' -f2")) 

내가이 작업을 수행하여 C에서 That⬆ 같은 출력을 얻을 수는 C를? : 이 버전은 오류 발생시 빈 문자열을 반환하고 출력용 정적 버퍼를 사용하기 때문에에서 쉽게 사용할 수 있습니다.그러나 일반적인 목적을 위해 나는 오류시 NULL을 반환하고 output + 인수의 크기를 전달할 것을 제안합니다. pclose()의 결과를 확인하여 호출 된 명령의 종료 상태를 판별 할 수도 있습니다. 루프가 없으면 첫 번째 출력 만 반환합니다.

0

표준 C는 외부 프로세스를 실행하고 표준 출력과 표준 오류를 수집하여이를 문자열로 반환하는 기능이 없습니다. 실제로 정책의 문제로 표준 C는 명시 적으로 메모리를 할당하는 것보다 함수가 아닌 동적으로 할당 된 메모리를 반환하는 함수를 제공하지 않습니다. POSIX의 환경에서

, 당신은 당신이 쉘 명령의 표준 출력을 읽을 수있게하는 FILE *을 제공하기 위해 popen()에 의존 할 수

FILE *file = popen("ip link | grep 'state UP' | cut -d : -f 2 | cut -d ' ' -f2", 
        "r")); 

if (file == NULL) { 
    // handle error 
} 

그런 다음 출력 스스로를 읽고 처리해야합니다; 아마도 fgets()를 통해 :

printf("Active Device:%s", buffer); 

파일이 pclose() 폐쇄해야 popen()을 열 것을 기억하십시오 :

char buffer[LARGE_ENOUGH]; 

// Read one line from the input (or part of one, if the buffer is too small) 
if (fgets(buffer, sizeof(buffer), file) == NULL) { 
    // handle error 
} 
// If a newline was read then it will be included 
buffer[strcspn(buffer, "\n")] = '\0'; 

당신은 결과를 인쇄 할 수있는 방법으로,

if (pclose(file) != 0) { 
    // handle error 
} 

주, 파이썬 버전처럼 stderr와 표준 출력을 포착하려면 I/O redire를 통해 표준 출력을 수용하는 것이 가장 좋습니다. 같은 명령에 ction :

FILE *file = popen(
     "{ ip link | grep 'state UP' | cut -d : -f 2 | cut -d ' ' -f2; } 2>&1", 
     "r"));