gpt4 book ai didi

c++ - 替代系统()

转载 作者:太空宇宙 更新时间:2023-11-04 15:17:44 25 4
gpt4 key购买 nike

我最近开始接触 C++ 编程,并且获得了很多使用它的经验。我过去的几个程序一直在使用 system() 命令,据我所知,这应该是一个非常糟糕的主意。首先,为什么这是个坏主意?我在 Linux 上使用它来清除屏幕 [ex: system("clear") ] 和启动程序的其他部分,例如返回菜单 [ex: system("./menu") ]。可以将它用于我上面显示的事情(无论如何都是主要的事情),还是有更好的解决方案?我只是作为一种爱好编程,但我仍然真的不喜欢制作蹩脚的程序。提前致谢!!

最佳答案

系统的问题可以分为三到四个不同的问题:

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

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

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

真正的解决方案取决于您要实现的目标。

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

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

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

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

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

关于c++ - 替代系统(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28137628/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com