我有一段执行流程并检索结果的代码。
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上的输出?
答案 0 :(得分:0)
如果孩子没有退出,那么对fgets()的调用将不会退出,因此您需要解决孩子没有退出的原因。在这种情况下最可能的原因是孩子因为没有标准输入而挂起了。
如果这是问题,您可以通过将管道模式更改为“rw”来解决它。您通常不需要对额外的管道做任何事情,它只需要在那里。
(正如你在评论中提到的那样,也可以通过使用命令shell重定向为孩子提供NUL
句柄作为标准输入来解决问题。)