2009-03-22 4 views
20

C++에서 외부 명령을 실행하는 가장 좋은 방법은 무엇인지 알고 싶습니다. 출력이 있으면 출력을 가져 오는 방법은 무엇입니까?C++/Linux에서 어떻게 외부 명령을 실행할 수 있습니까?

편집 : 나는이 세상에서 초보자라는 말을해야만 했으므로 나는 실제 사례가 필요하다고 생각합니다. 예를 들어, 다음과 같은 명령을 실행하고 싶습니다.

ls -la 

어떻게하면됩니까?

+0

@ Mehrdad의 링크를 보면 ls =와 같은 예가 있습니다. – bayda

답변

22

popen 기능을 사용하십시오.

예 (완전하지 생산 품질 코드, 오류 처리)

FILE* file = popen("ls", "r"); 
// use fscanf to read: 
char buffer[100]; 
fscanf(file, "%100s", buffer); 
pclose(file); 
+10

@Daniel 이것은 프로덕션 코드가 아닙니다. 이것은 popen 함수와 그 인수에 대한 높은 수준의 아이디어를 제공해야하는 온라인 포럼에 대한 대답입니다. 프로덕션 코드로 모든 스택 오버플로 응답을 처리하는 습관을 가진 사람은 이보다 심각한 문제가 있습니다. 또한, 오버플로 가능성이있는 버퍼는 AT의 심각한 보안 위협에 사로 잡히지 않습니다. 특정 위협 모델이없고 무엇이 신뢰할 수 있고 어떤 것이 특정 환경에 적용되지 않는지 아는 경우 보안에 대한 논의는 중요하지 않습니다. –

+0

@ 대니얼 (D 다니엘) 당신의 첫 번째 발언이 대부분의 사람들을 설득 할 것이라고 생각합니다. CERT 페이지에 대한 링크를 제공하지 않는 이유는 무엇입니까? 이것이 [보안 프로그래밍 노트] (https://www.securecoding.cert.org/confluence/pages/viewpage.action?pageId=4063380)의 어딘가에 있다고 확신합니다. Mehrdad는 그의 대답을 업데이트 할 수도 있습니다. –

+0

@Daniel 나는 당신의 말을 들었다. 물론, 모든 가능한 잡았다에 대한보다 완벽한 답변이 더 나은 대답이 될 수 있습니다. 3 줄의 코드로 잡았다에 관한 책을 쓸 수 있습니다. 그러나이 질문과 밀접한 점은 "popen"이며 외부 프로세스의 출력을 어떻게 처리 할 것인가가 아니라는 것입니다. –

1

사용 시스템 ("LS -la") 함수

+0

나는 이것이 왜 downvoted 이유를 모르겠다 ... –

+1

그것은 질문에 대답하지 않습니다. system() 호출에서 출력을 얻을 수있는 방법은 없습니다. – greyfade

+0

그것은 사람이 작동합니다 .. devC++ IDE에서 여러 번 사용했습니다 .... – suresh

20

예 :

#include <stdio.h> 

int main() { 
    FILE * f = popen("ls -al", "r"); 
    if (f == 0) { 
     fprintf(stderr, "Could not execute\n"); 
     return 1; 
    } 
    const int BUFSIZE = 1000; 
    char buf[ BUFSIZE ]; 
    while(fgets(buf, BUFSIZE, f)) { 
     fprintf(stdout, "%s", buf ); 
    } 
    pclose(f); 
} 
+0

메인의 끝에서 0을 잊어 버렸습니다. fgets에서 sizeof (buff) 대신 1000을 사용하십시오 :) – bayda

+3

C++은 main의 끝에 return을 요구하지 않습니다. –

+0

사실 그렇지만 돌아 오는 것이 좋으므로 프로그램에서 무엇이 나오는지 분명합니다. –

15

popen은 당신이 찾고있는 일을 확실히하고 있지만 몇 가지 단점이 있습니다 :

(210) 그것은 그것은 한 방향으로 만 작동
  • (당신이 사용자 제공 명령 문자열을 untaint해야한다는 것을 의미), 중 당신에게 서브 프로세스에 입력을 제공하거나 할 수 있습니다가 실행하고있는 명령에서 쉘을 호출
    • 출력을 읽을 수 있습니다. 당신이 다른 간부 중의 하나로 execlp을 대체 할 수있는, 물론

      int Input[2], Output[2]; 
      
      pipe(Input); 
      pipe(Output); 
      
      if(fork()) 
      { 
          // We're in the parent here. 
          // Close the reading end of the input pipe. 
          close(Input[ 0 ]); 
          // Close the writing end of the output pipe 
          close(Output[ 1 ]); 
      
          // Here we can interact with the subprocess. Write to the subprocesses stdin via Input[ 1 ], and read from the subprocesses stdout via Output[ 0 ]. 
          ... 
      } 
      else 
      { // We're in the child here. 
          close(Input[ 1 ]); 
          dup2(Input[ 0 ], STDIN_FILENO); 
          close(Output[ 0 ]); 
          dup2(Output[ 1 ], STDOUT_FILENO); 
      
          execlp("ls", "-la", NULL); 
      } 
      

      : 당신이 다음 출력을 서브 프로세스를 호출 입력을 제공하고 캡처하려면

    이 뭔가를해야 할 것이다 기능을합니다.

  • 관련 문제