我要做的是创建一个程序,在运行时打开带有“--exampleparameter --exampleparameter2”作为cli输入的examplecliprogram.exe,等待examplecliprogram.exe终止,然后输出做一些有用的事情。我希望examplecliprogram.exe在后台运行(而不是在另一个窗口中打开),而examplecliprogram.exe的输出显示在运行开销程序的窗口中。
到目前为止,我已经探索了诸如popen(),ShellExecute()和CreateProcess()之类的选项,但我似乎无法使它们中的任何一个正常工作。
首先,我希望这个程序能够在Windows环境中独立运行,并且与Linux的兼容性将是一个奖励。
编辑:我通过调用system(“arguments”)找到了一个解决方案。我不知道这是否是一个很好的解决方案,可以很好地转移到gui,但至少它解决了根本问题。
答案 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.*/