2012-08-02 8 views
2

실행하려는 프로그램이 실행 중일 때 cli- 입력으로 "--exampleparameter --exampleparameter2"를 사용하여 examplecliprogram.exe를 열고 examplecliprogram.exe를 기다립니다. 종료 한 다음 출력물을 가져와 유용한 정보를 얻으십시오. 오버 헤드 프로그램을 실행하는 창에 examplecliprogram.exe의 출력이 표시되는 동안 examplecliprogram.exe를 다른 창에서 열지 않고 백그라운드에서 실행하고 싶습니다.C - 실행 파일 실행 및 출력 검색

지금까지 popen(), ShellExecute() 및 CreateProcess()와 같은 옵션을 살펴 보았지만 제대로 작동하지 않는 것으로 보입니다.

주로이 프로그램을 Windows 환경에서 독립적으로 실행할 수 있고 Linux와의 호환성이 보너스가되기를 바랍니다.

편집 : system ("arguments")을 호출하여 하나의 해결책을 찾았습니다. 이것이 GUI에 잘 전달 될 수있는 좋은 해결책인지는 모르지만 적어도 근본적인 문제는 해결됩니다.

+1

Qt는 또는은 Gtk와 같은 크로스 플랫폼 툴킷을 사용하는 경우, 당신은 휴대용 방법 (Qt는, GTK에'g_spawn_async_with_pipe'에, 예를 들어'QProcess') 그렇게 할 수있는 기능을 가지고 있습니다. –

+1

시도한 것을 보여주는 몇 가지 코드를 게시하십시오. 'popen'은 확실히 가장 쉬운 방법입니다 (그리고 크로스 플랫폼입니다).하지만 제한이 있습니다. 'CreateProcess'는 가장 완벽한 기능을 갖추고 있지만 헤비급이며 사용하기가 더 복잡하며 플랫폼 간 차이가 없습니다. –

답변

0

이 코드는 Visual Studio, Cygwin의 GCC 및 Mac OS X의 GCC에서 테스트 한 Windows 및 Unix에서 실행됩니다.

Windows에서 함수는 _popen이고 다른 플랫폼에서는 함수 이름이 popen (이전의 밑줄에 유의하십시오.)이기 때문에 플랫폼에 따라 popen을 정의하는 데 매크로를 사용해야했습니다.

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

/* Change to whichever program you want */ 
//#define PROGRAM "program.exe --param1 --param2" 
#define PROGRAM "dir" 
#define CHUNK_LEN 1024 

#ifdef _WIN32 
#define popen _popen 
#define pclose _pclose 
#endif 

int main(int argc, char **argv) { 

    /* Ensure that output of command does interfere with stdout */ 
    fflush(stdin); 
    FILE *cmd_file = (FILE *) popen(PROGRAM, "r"); 
    if (!cmd_file) { 
     printf("Error calling popen\n"); 
    } 

    char *buf = (char *) malloc(CHUNK_LEN); 
    long cmd_output_len = 0; 
    int bytes_read = 0; 
    do { 
     bytes_read = fread(buf + cmd_output_len, sizeof(char), CHUNK_LEN, cmd_file); 
     cmd_output_len += bytes_read; 
     buf = (char *) realloc(buf, cmd_output_len + CHUNK_LEN); 
    } while (bytes_read == CHUNK_LEN); 

    /* Nul terminate string */ 
    *((char *) buf + cmd_output_len) = '\0'; 

    /* Close file pointer */ 
    pclose(cmd_file); 

    /* Do stuff with buffer */ 
    printf("%s\n", buf); 

    /* Free buffer */ 
    free(buf); 

    return 0; 
} 
0

나는 CreateProcess를 사용했지만, 불행히도 'carefull reading of msdn'과 'simple and progress from complex'이외의 다른 것은 추천 할 수 없습니다.

이식성에 관해서는 - 지금까지 몇 가지 크로스 플랫폼 툴킷을 사용해야 할 필요가 없다면, 이것 때문에 하나를 사용하기를 권장하지 않겠습니다. 몇 가지 '시작 프로세스'래퍼를 작성하고 각 플랫폼에서 기본 방식으로 구현하는 것이 좋습니다.

0

이 일의 깨끗하고 대부분의 휴대용 방법은 입심의 g_spawn_sync()를 사용하는 것입니다.

online 문서를 찾을 수 있습니다.

gchar * std_out = NULL; 
gchar * std_err = NULL; 
gint exit_stat = 0; 
const char *argv[] = {"--foo", "123", "--bar", "22323", NULL}; 

if(!g_spawn_sync (NULL, argv, NULL, NULL, NULL, NULL, &std_out, &std_err, &exit_stat, NULL)){ 
    fprintf(stderr, "Failed to spawn!\n"); 
}; 

/* std_out and std_err should now point to the respective output.*/