gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:10:48 25 4
gpt4 key购买 nike

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

   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++ 中使用 system() 时,我的程序卡住了,我该如何让它继续?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23330401/

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