从C++运行命令

Running a command from C++

本文关键字:命令 运行 C++      更新时间:2023-10-16

要从 Linux 中的 C++ 获取 CPU 信息,我只需使用:

if (!system("cat/proc/cpuinfo")) cout <<"Error" <<endl;

更新:问题是我没有得到输出

它告诉你system返回一个值,而你没有检查它,所以(在这种情况下)如果system失败,你不会知道它。

假设您想在 Linux 上以编程方式获取有关 CPU 的信息(而不仅仅是在 stdout 终端上显示/proc/cpuinfo,就像您对 system 的调用那样),您应该更好地阅读文件/proc/cpuinfo

例如
  ifstream fcp("/proc/cpuinfo");
  std::string lin;
  while (!fcp.eof()) {
     lin = fcp.getline ();
     // parse appropriately the file fcp, e.g.
     if (lin.find("vendor_id") >= 0) 
       // do something useful 

上面的代码片段不完整。您必须完成它才能从/proc/cpuinfo中提取您真正想要的信息。

当然,您可以通过其他方式阅读/proc/cpuinfo(例如 fopenfgetssscanf à la C)....如果您真的想读取某些命令的输出(在您的情况下它是无用的),请考虑popen

你也许会很高兴只调用 uname(2) syscall(它提供的信息比 /proc/cpuinfo 少得多)。


谷歌搜索 cpufreqcpufrequtils 给出了这个

该函数返回一个值,指示调用是否成功。

程序忽略此值,这可能会导致潜在问题。

这就是您收到编译器警告的原因。

这是一个编译器警告,告诉您您的代码可能不是您想要编写的代码。 C++ 中的 system 函数返回一个 int 值,该值通常包含您使用 system 运行的命令的状态代码。

在这种情况下,如果该数字不是 0(即 if(system("cat /proc/cpuinfo") != 0) ),则可能需要处理错误。

Linux 有一个独特的开放函数,称为 popen,它允许您挂接到终端命令的 stdout。

您可以使用以下代码从终端命令读取任何输出:

FILE *pF = popen(aCmd, "r");
if(!pF)
{
    return "ERROR";
}
char cChar = '';
std::string rtnStr = "";
while(!feof(pF))
{
    cChar = fgetc(pF);
    if(cChar == 'n')
    {
        break;
    }
    rtnStr += cChar;
}

并使用命令cat /proc/cpuinfo获取 CPU 信息。您还可以添加| grep后跟"MHz"、"型号"或"内核"等内容以了解详细信息。