gpt4 book ai didi

c++ - C++ 管道系统调用总是以 EOF 结尾吗?

转载 作者:搜寻专家 更新时间:2023-10-31 00:37:26 24 4
gpt4 key购买 nike

在这里使用 SO 帖子:How do I read the results of a system() call in C++?

我能够编写一个运行任意系统命令并以字符串形式返回任何输出的函数:

string pipeAndGetResults(string cmd)
{
const char* ccmd = cmd.c_str();
FILE* stream = popen( ccmd, "r" );
std::ostringstream output;
while( !feof( stream ) && !ferror( stream ))
{
char buf[128];
int bytesRead = fread( buf, 1, 128, stream );
output.write( buf, bytesRead );
}
string result = output.str();
boost::trim(result);
return result;
}

我一直将它用于“立即”产生值的系统命令。我的问题是如果 cmd 需要一些时间来运行,比如一分钟,然后写入结果,这个函数是否也能工作。我在使用 Python 的 pexpect 做类似的事情时遇到了问题;如果 cmd 需要一段时间,它在等待结果时超时,我无法限制 cmd 的运行时间。我相信这个问题可以简化为 cmd 是否总是在运行多长时间后写入 eof

最佳答案

feof() 不检测输入流中的 EOF 字符。它指示是否尝试读取超过文件末尾。此外,根据我的经验,我会说大多数命令不会在其输出末尾写入 EOF 字符。 fread() 调用将阻塞,直到有数据要读取,除非它被中断,因此命令运行多长时间并不重要。根据您使用的操作系统,您可以告诉系统在出现信号时恢复中断的系统调用。我也同意 Bastile。您应该使用更大的缓冲区以获得更高效的 I/O。

关于c++ - C++ 管道系统调用总是以 EOF 结尾吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19796515/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com