当在c++中使用system()时,我的程序被卡住了,我该如何让它继续

When using system() in c++ my program gets stuck, how do I get it to proceed?

本文关键字:继续 程序 c++ system 我的 当在      更新时间:2023-10-16

我正在制作一个磁盘实用工具,它获取diskstats(在linux中)并从中计算值。我的基本问题是,当系统()调用发生时,程序会挂在那里。

   system("grep 'sda ' /proc/diskstats | tee "report.txt"");
   ifstream inStream;
   inStream.open("report.txt");
if (inStream.fail()) {
    cout << "Report gathering failed." << endl;
    return;
}
while (!inStream.eof()) {
    inStream.ignore();
    inStream.ignore();
    inStream.ignore();
    inStream >> numReads1;
    inStream.ignore();
    inStream >> sectorReads1;
    inStream.ignore();
    inStream >> numWrites1;
    inStream.ignore();
    inStream >> sectorWrites1;
    inStream.ignore();
    inStream.ignore();
    inStream.ignore();
    inStream.ignore();
}

system("grep 'sda ' /proc/diskstats | tee "report.txt"");

你为什么这么做?它当然会挂起来。tee将所有输入复制到标准输出和指定为tee参数的每个文件。您没有从tee的标准输出中读取任何内容。如果有足够的匹配,输出缓冲区将被填满,进程将挂起。

使用system可以完成的是

system("grep 'sda ' /proc/diskstats > report.txt");

您不需要report.txt周围的引号,也不需要tee。然而,如果你不需要,就没有理由写那个文件。你本可以用popen代替:

FILE* grep_sda = popen (""grep 'sda ' /proc/diskstats", "r");

注意,popen的结果是FILE指针。这里有三个选择:

  • 使用C样式I/O读取FILE指针
  • 如果幸运的话,有些系统为std::fstream提供了非标准构造函数,这些构造函数从C流构造C++文件流
  • 可能有一个提升的解决方案。我不能在工作中使用Boost,也不要在工作之外使用它

另一种选择是绕过grep的使用。这里不需要grep,因为模式非常简单。以C++std::ifstream的形式打开文件,使用std::getline从中读取行,筛选与std::find匹配的行,然后解析匹配的行。