2013-10-19 33 views
5

鉴于您正在构建一个Windows专有程序,为什么system()如此讨厌?自从我开始使用C++编程以来,“不要触摸系统”是我听到过的非常多的东西。我顺从地服从了这个原则,但是它有什么不好?system()有什么不好?

+4

另外,人们倾向于在'system()'中放置的东西通常很简单,就像清空屏幕或暂停一样。它倾向于被用作一种懒惰的次优方式,在实际的代码中做得更好。 –

+0

如果你做错了,并通过unsanitized用户输入它,你打开你的应用程序,以指挥注入漏洞。攻击者可以使用与您的应用程序相同的权限运行任意命令。 –

+2

如果你知道你在做什么,做任何你想做的事。 – deepmax

回答

6

您在系统调用中放入的内容取决于您将在其上运行该程序的操作系统。所以它是完全不可移植的。此外,很多事情都可能出错,因为你只是将一个命令投入虚空,并希望一切都会好起来。错误处理(例如 - 您想运行的程序不存在,或者PATH设置不正确,或者您没有权限等)非常困难,甚至是不可能的。除此之外,大多数时候(真的是“最”,如99.999%)的评论中指出,没有必要使用system

+0

“所以它是完全不可移植的。”系统(””);看起来相当随身携带 – user1233963

5

std::system()要求您信任命令来执行您想要的操作。你无法验证这个假设是否合理。例如,PATH环境变量的一个不常见的值可能会导致执行一个不同的程序,而不是标准设置。

std::system()的调用行为取决于系统。即使目前的要求是,应用程序不需要在其他操作系统上运行,这个要求也会改变。考虑到std::system()通常用于可以以更便携的方式实现的目的(尤其是初学者),因此不需要在此引入平台依赖性。

1

system()调用操作系统的命令解释器作为一个单独的过程。有更多的时候,有些本地API可以直接在调用过程中完成相同的结果,并有更多的控制权。