在应用程序中调用linux命令行工具

时间:2014-02-26 22:46:15

标签: c++ linux performance

我正在编写一个将要进行性能监控的C ++应用程序。我只是想在exe中包含对iostat的调用。 (技术原因必须以这种方式完成,我宁愿不这样做。)

我的问题是,如果我在exe中包含对iostat的调用,那是非常愚蠢的吗? (在表现方面)

示例:

while (true) {
   every 200ms
      make system call to iostat, store results in my_data_structure
      do some math on my_data_structure  
}

傻?或者有更好的方法吗?

编辑:没关系,我可以通过阅读/ proc / diskstats和其他文件得到我需要的东西。

1 个答案:

答案 0 :(得分:3)

  

我的问题是,如果我在exe中包含对iostat的调用,那是非常愚蠢的吗?

我不会称之为“令人难以置信的愚蠢”,但它肯定不会让你获得诺贝尔奖。我看到更糟糕了。这个想法有两个令人反感的事情:

  1. 当你使用shell命令时,你真的应该使用shell脚本。
  2. iostat命令只是一个读取一组标准Linux文件的简单程序,因此,为什么不直接自己阅读它们。
  3. 你说你有理由不想了解为什么需要使用可执行文件(从C / C ++编译)。我完全不知道这些原因是什么,因为如果你想做你想做的事情(调用iostat),你需要从你的C ++程序调用系统的shell解释器(通常是“bash”)。那么,运行调用bash运行命令(iostat)的程序(C ++)和调用bash来运行运行命令(iostat)的脚本之间的区别是什么。我无法想到任何可能使一个成为可能而另一个成为可能的东西。无论如何,这不是世界末日,您可以使用popen()关注invoking a command and retrieving its output的这些说明。

    第二个反对意见是iostat非常简单(如herehere所示)。 iostat程序实际上没有做任何事情,只读取来自/proc等文件夹中标准系统监视伪文件的数据,如手册中所列:

       /proc/stat contains system statistics.
    
       /proc/uptime contains system uptime.
    
       /proc/diskstats contains disks statistics.
    
       /sys contains statistics for block devices.
    
       /proc/self/mountstats contains statistics for network filesystems.
    
       /dev/disk contains persistent device names.
    

    这意味着根据您的具体问题,您很可能只是直接从这些文件中读取您需要的内容(或者从iostat的源代码中获取一些代码来执行此操作)。 iostat的要点是从这些文件中读取数据并使其“人类可读”并按要求格式化。我怀疑你在程序中要解析iostat输出所需的字符串解析比直接从这些系统文件中检索所需数据所需的解析要简单得多。

    尽管如此,做你提出的建议毕竟不是那么可怕。