当在c++中使用system()时,我的程序被卡住了,我该如何让它继续
When using system() in c++ my program gets stuck, how do I get it to proceed?
我正在制作一个磁盘实用工具,它获取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
匹配的行,然后解析匹配的行。
相关文章:
- 我正在尝试使用 c++ 创建一个货币转换程序,我不知道如何继续
- C++ 在信号处理程序后继续执行
- 为什么我的Qt程序在断言失败后继续运行?
- 在程序继续C++时保持进程运行
- 继续运行程序而无需任何干预,直到要求退出为止
- 选择"Y"继续后,我的程序一直处于关闭状态
- C++,程序输出无效输入,但继续通过循环
- 即使密码/用户无效,程序仍会继续
- 测试回文时程序不会继续运行 (C++)
- 程序终止,而不是继续整数输入验证循环
- 即使有例外,希望程序继续继续
- C++,我怎样才能在继续整个程序的同时延迟程序的一部分
- 在SIGABRT c ++信号之后继续运行程序
- 是什么导致程序在我继续执行另一个功能之前停止
- 如何退出函数,但继续程序的其余部分
- 当我使用继续时,程序不提供任何输出
- 继续在质数C 程序中获得浮点异常
- 我的程序在调用"parsePacket()"后是继续运行,还是等到收到数据?
- 希望定期执行一个函数,但继续程序循环的其余部分
- 等待输入C++时继续程序