系统的替代()

时间:2015-01-25 14:41:53

标签: c++

我最近进入了c ++编程,我已经获得了很多经验。我过去的几个程序一直在使用system()命令,我读过它应该是一个非常糟糕的主意。首先,为什么这是一个坏主意? 我在Linux上使用它来清除屏幕[例如:系统("清除")]并启动程序的其他部分,例如返回菜单[例如:系统(&#34) ; ./ menu")]。可以将它用于我上面展示的东西(无论如何都是主要的东西),还是有更好的解决方案?我只是作为一个爱好编程,但我仍然不喜欢制作糟糕的程序。在此先感谢!!

1 个答案:

答案 0 :(得分:7)

system的问题可分为三个或四个不同的问题:

  1. 资源使用 - 系统使用相当多的系统资源,需要内存,执行时间和文件系统I / O来创建新进程并在其中执行shell。

  2. 外部程序的可移植性(system("clear");在Windows上不起作用,因为“cls”命令用于清除屏幕 - 或者至少不会清除屏幕,如果你真的是不幸的是,有人编写了一个名为“clear”的清理程序,如果你是一名系统管理员用户,它将删除客户数据库。如果你需要将参数传递给程序,并且不同的环境使用不同的选项集,那么它会变得更加有趣。参数。

  3. 安全。如果你从你的应用程序中调用system("clear");,并且有人用一些不同的代码替换了本地的“clear”,这些代码也会删除某些文件,或者或多或少是邪恶的东西,这将是一件坏事。由于您启动了一个外部程序,因此您需要非常特定于该程序的路径,然后遇到可移植性问题。

  4. 解决方案的实际取决于您要实现的目标。

    对于少数情况,使用system或其中一个密切相关的函数(例如popen())将是正确的。在Linux和其他版本的Unix上,使用fork()后跟exec()可能是正确的 - 至少它减少了资源开销的情况。

    system("clear");的情况下,它可以替换为输出一个短的字符序列 - 例如"\033[0J",它适用于任何ANSI / VT100兼容的终端/控制台窗口 - 这几乎是涵盖了你现在所见过的任何东西,除非你真的去寻找模糊和不寻常的系统。 [Windows除外,您需要在控制台API中调用“清除屏幕”功能]。

    一般来说,如果需要可移植性,system()通常不是一个好的解决方案,使用多个平台上可用的库[或自己创建]是更好的选择。

    从资源和可移植性的角度来看,你调用system("./menu");的例子听起来也不是正确的,因为那会启动一个新的menu程序,你可能已经运行了一个 - 除非您的menu程序在成功选择后退出。如果你不断启动越来越多的进程,它将永远填满整个系统,即使在具有大量内存的现代系统上需要一段时间。

    在这里,我的解决方案是构建一个包含所有功能的更大程序,并让主菜单简单地调用程序中的函数。通常可以使用某种层次结构创建多层菜单,其中一个菜单选择要么导致另一个菜单或“做某事” - 类层次结构或某种类型的函数指针表可能是正确的解决方案,但同样,这是一个相当广泛的主题,绝对没有一个答案是正确的。