为什么'system'不应该在 Windows 特定的应用程序中使用

Why 'system' should not be used in a Windows specific aplications

本文关键字:应用程序 Windows system 不应该 为什么      更新时间:2023-10-16

我正在制作Windows应用程序,其目的是通知我我的连接停机时间并记录它们以供以后使用/报告。现在,我使用批处理脚本来实现相同的目标,并考虑将其合并到项目中,但是当我调查该主题时,我遇到了多个建议,我不应该在任何C++程序中使用system。大多数时候,原因是">它是特定于操作系统的"和">资源要求高"我得到了这个想法,但我想知道:如果我的目的是专门为 Windows 操作系统制作应用程序,为什么我使用system很糟糕,特别是如果它将是可以在后台运行的轻量级程序

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

  • C/C++ 中的 system():

    1. 这是一个非常昂贵且资源繁重的函数调用
    2. 它不是可移植的:使用 system() 会使程序非常不可移植,即这仅适用于在系统级别具有暂停命令的系统,如 DOS 或 Windows。但不是Linux,MAC OSX和大多数其他产品。
  • 我强烈不同意使用系统功能 (太长了,无法在这里引用)

  • system() 调用邪恶吗?

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

其中一些论点目前与我的项目无关,因此在这种特殊情况下我不介意它们,但结合我读到的所有这些担忧似乎表明,人们应该不惜一切代价避免使用system()调用。所以我发现我应该使用另一种方法(我找到了一堆),但至少现在所有这些对我来说似乎有点太复杂了(即:这不仅仅是附加我已经功能齐全的整个脚本,大约是该长度的一半(25 行))

为什么system被认为是一种不好的做法:

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

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

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

编辑:

(*) 规则就像你不使用系统,或者不使用原始指针...除非您有充分的理由不这样做,否则应遵循这些规则。