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

标签 c++

在此处使用 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() 调用将阻塞,直到有数据要读取为止,除非它被中断,所以命令运行多长时间并不重要。根据您使用的操作系统,您可以告诉系统在出现信号时恢复中断的系统调用。我也同意巴斯蒂尔的观点。您应该使用更大的缓冲区来提高 I/O 效率。

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

相关文章:

c++ - 位操作 : compute sum over all bits (aka number of 1's) in a uint64_t

c++ - CString 赋值错误

c++ - 将 ruby​​ 库静态链接到 C++ 应用程序

c++ - 每次在循环中进行临时均匀随机分布的效率如何?

c++ - 将 C 风格数组从 xtensor 移至 `xt::array`

c++ - 模板函数中特定于类型的静态声明

c++ - 基于整体类模板专门化一个类方法

c++ - WinCE C++ 应用程序开发

C++跨平台代码

c++ - QChartView QLineSeries 通过鼠标点击选择