C - 运行可执行文件并检索输出

时间:2012-08-02 17:37:45

标签: c windows

我要做的是创建一个程序,在运行时打开带有“--exampleparameter --exampleparameter2”作为cli输入的examplecliprogram.exe,等待examplecliprogram.exe终止,然后输出做一些有用的事情。我希望examplecliprogram.exe在后台运行(而不是在另一个窗口中打开),而examplecliprogram.exe的输出显示在运行开销程序的窗口中。

到目前为止,我已经探索了诸如popen(),ShellExecute()和CreateProcess()之类的选项,但我似乎无法使它们中的任何一个正常工作。

首先,我希望这个程序能够在Windows环境中独立运行,并且与Linux的兼容性将是一个奖励。

编辑:我通过调用system(“arguments”)找到了一个解决方案。我不知道这是否是一个很好的解决方案,可以很好地转移到gui,但至少它解决了根本问题。

4 个答案:

答案 0 :(得分:0)

您可能希望查看此Microsoft示例代码。这对我很有用。 http://msdn.microsoft.com/en-us/library/ms682499%28VS.85%29.aspx

答案 1 :(得分:0)

我使用了CreateProcess,遗憾的是,除了“仔细阅读msdn”和“从简单到进展到复杂”之外,我不能推荐你。

至于可移植性 - 如果到目前为止你还不需要使用一些跨平台工具包,我建议你不要因为这个而开始使用它。我建议你写一些'start process'包装器,并以原生方式在每个平台上实现它。

答案 2 :(得分:0)

此代码在Windows和Unix上运行(我在Visual Studio中测试,在Cygwin上测试GCC,在Mac OS X上测试GCC)。

我必须使用宏来定义popen,具体取决于平台,因为在Windows上,函数是_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;
}

答案 3 :(得分:0)

最干净,最便携的方法是使用GLib的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.*/