在Windows上执行进程并获得结果

时间:2015-07-26 16:15:36

标签: c++ windows process

我有一段执行流程并检索结果的代码。

file.stat.size

这对我来说在Linux上运行得很好,但是在Windows上,它有一种可怕的死锁习惯 - 似乎namespace { FILE* really_popen(const char* cmd, const char* mode) { #ifdef _MSC_VER return _popen(cmd, mode); #else return popen(cmd, mode); #endif } void really_pclose(FILE* pipe) { #ifdef _MSC_VER _pclose(pipe); #else pclose(pipe); #endif } std::string ExecuteProcess(std::string cmd) { FILE* pipe = really_popen(cmd.c_str(), "r"); if (!pipe) throw std::runtime_error("Could not invoke command " + cmd); char buffer[128]; std::string result = ""; while(!feof(pipe)) { if(fgets(buffer, 128, pipe) != NULL) result += buffer; } really_pclose(pipe); return result; } } 永远不会返回。我已查看了CRT来源,fgets最终委托给fgets,后者永远不会返回。

如果我从命令行调用命令,它会在一秒内返回。

如何在不解锁父级的情况下读取Windows上的输出?

1 个答案:

答案 0 :(得分:0)

如果孩子没有退出,那么对fgets()的调用将不会退出,因此您需要解决孩子没有退出的原因。在这种情况下最可能的原因是孩子因为没有标准输入而挂起了。

如果这是问题,您可以通过将管道模式更改为“rw”来解决它。您通常不需要对额外的管道做任何事情,它只需要在那里。

(正如你在评论中提到的那样,也可以通过使用命令shell重定向为孩子提供NUL句柄作为标准输入来解决问题。)