为什么不应在Windows特定的应用程序中使用“系统”

时间:2017-06-20 09:24:08

标签: c++ batch-file

我正在制作Windows应用程序,其中purpouse是通知我我的连接停机时间并记录它们供以后使用/报告。现在我使用批处理脚本来实现相同的目标并考虑将其纳入项目但是当我调查这个主题时,我遇到了多个建议,我应该not ever use system within any of my C++ programs。大部分时间原因是'它是特定于操作系统的'和'资源需求'我有了这个想法,但我想知道:为什么它不好我使用system如果我的意图是专门为Windows操作系统制作应用程序,特别是如果它将是在后台运行的轻量级程序

编辑: 我想这需要澄清,所以更多来源:

  • system() in C/C++

      
        
    1. 这是一个非常昂贵且资源丰富的函数调用
    2.   
    3. 它不可移植:使用system()会使程序非常不可移植,即仅适用于在系统级别具有pause命令的系统,如DOS或Windows。但不是Linux,MAC OSX和其他大多数人。
    4.   
  • I strongly disagree with using the system function (这里引用太久了)

  • Are system() calls evil?

      
        
    1. system()灵活性较差。 (我都可以)      
          
      1. 它无法控制正在执行的命令。 (对我很好,我只需要从脚本中返回值)
      2.   
      3. 它不是独立于平台的。 (现在,这将是一个问题。我真的很想看到一个在不同平台上表现不同的例子)
      4.   
      5. 这是一个安全问题。 (同样,这将是一个问题。有人可以提供system()的潜在安全问题的示例吗?)
      6.   
    2.   

其中一些论点现在与我的项目无关,所以在这种特殊情况下我并不介意它们,但是我所阅读的所有这些问题的结合似乎表明应该避免使用system()调用所有费用。所以我想我应该使用另一种方法(我发现了一堆)但是现在至少对我来说它们似乎有点太复杂了(即:this而不是仅仅附加我已经完成的整个脚本约为该长度的一半(25行))

1 个答案:

答案 0 :(得分:2)

为什么system被视为不良做法:

  • 您无法控制命令(它是否在shell中启动,...)
  • 存在安全问题(主要是别名问题)
  • 它不便携
  • system不允许您进行高级错误管理和输出/输入管理(例如,您无法将命令的输出保存在变量中)

如果您不关心这些问题,可以使用system。计算机科学中几乎没有绝对规则(*)。有时候被认为是不好的做法(比如system)就足够了,只要你知道为什么这种做法很糟糕并花时间思考你为何使用不良做法(而不是使用好的做法)。

因此,如果你不关心为什么system是坏的的论据,请使用它,但要记住为什么这是一个不好的做法。

修改

(*)规则,如你不使用系统,或不使用原始指针 ...除非你有充分的理由,否则应该遵循这些规则不要。