系统()的替代方案

2024-04-10

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


存在的问题system可以分为三到四个不同的问题:

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

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

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

解决方案是什么实际上取决于您想要实现的目标。

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

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

系统()的替代方案 的相关文章

  • 为什么使用abs()或fabs()而不是条件否定?

    在 C C 中 为什么要使用abs or fabs 不使用以下代码即可查找变量的绝对值 int absoluteValue value lt 0 value value 这与较低级别的指令较少有关吗 您提出的 有条件的abs 并不等于std
  • Tensorflow 中的自定义资源

    由于某些原因 我需要为 Tensorflow 实现自定义资源 我试图从查找表实现中获得灵感 如果我理解得好的话 我需要实现3个TF操作 创建我的资源 资源的初始化 例如 在查找表的情况下填充哈希表 执行查找 查找 查询步骤 为了促进实施 我
  • 将处理后的图形绘制到另一个图形中

    我想将一个经过处理的图形绘制到另一个图形中 I have two graphics var gHead Graphics FromImage h var gBackground Graphics FromImage b Transform
  • 捕获 foreach 条件中抛出的异常

    我有一个foreach在 foreach 本身的条件下循环期间中断的循环 有没有办法try catch抛出异常然后继续循环的项 这将运行几次 直到异常发生然后结束 try foreach b in bees exception is in
  • 在 C++11 中省略返回类型

    我最近发现自己在 C 11 模式下的 gcc 4 5 中使用了以下宏 define RETURN x gt decltype x return x 并编写这样的函数 template
  • 有什么工具可以说明每种方法运行需要多长时间?

    我的程序的某些部分速度很慢 我想知道是否有我可以使用的工具 例如它可以告诉我可以运行 methodA 花了 100ms 等等 或者类似的有用信息 如果您使用的是 Visual Studio Team System 性能工具 中有一个内置分析
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • 如何在 VS 中键入时显示方法的完整文档?

    标题非常具有描述性 是否有任何扩展可以让我看到我正在输入的方法的完整文档 我想查看文档 因为我可以在对象浏览器中看到它 其中包含参数的描述和所有内容 而不仅仅是一些 摘要 当然可以选择查看所有覆盖 它可能是智能感知的一部分 或者我不知道它并
  • VS30063:您无权访问 https://dev.azure.com

    我正在尝试在 asp net core 2 1 mvc 应用程序中使用以下代码连接 Azure DevOps Uri orgUrl new Uri https dev azure com xxxxx String personalAcces
  • 为什么密码错误会导致“填充无效且无法删除”?

    我需要一些简单的字符串加密 所以我编写了以下代码 有很多 灵感 来自here http www codeproject com KB security DotNetCrypto aspx create and initialize a cr
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • 为什么 FTPWebRequest 或 WebRequest 通常不接受 /../ 路径?

    我正在尝试从 ftp Web 服务器自动执行一些上传 下载任务 当我通过客户端甚至通过 Firefox 连接到服务器时 为了访问我的目录 我必须指定如下路径 ftp ftpserver com AB00000 incoming files
  • 通过不同 DLL 或 EXE 中的指针或引用访问 STL 对象时发生访问冲突

    我在使用旧版 VC6 时遇到以下问题 我只是无法切换到现代编译器 因为我正在处理遗留代码库 http support microsoft com kb 172396 http support microsoft com kb 172396
  • 组合框项目为空但数据源已满

    将列表绑定到组合框后 其 dataSource Count 为 5 但组合框项目计数为 0 怎么会这样 我习惯了 Web 编程 而且这是在 Windows 窗体中进行的 所以不行combo DataBind 方法存在 这里的问题是 我试图以
  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • 为什么我使用google'smtp'无法发送电子邮件?

    我有以下程序使用 smtp gmail com 587 发送电子邮件 namespace TestMailServer class Program static void Main string args MailMessage mail
  • 为什么 Ajax.BeginForm 在 Chrome 中不起作用?

    我正在使用 c NET MVC2 并尝试创建一个 ajax 表单来调用删除数据库记录 RemoveRelation 的方法 删除记录的过程正在按预期进行 删除记录后 表单应调用一个 JavaScript 函数 从视觉效果中删除该记录 Rem
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它
  • Swagger 为 ASP.CORE 3 中的字典生成错误的 URL

    当从查询字符串中提取的模型将字典作为其属性之一时 Swagger 会生成不正确的 URL 如何告诉 Swagger 更改 URL 中字典的格式或手动定义输入参数模式而不自动生成 尝试使用 Swashbuckle 和 NSwag 控制器 pu
  • 从类模板参数为 asm 生成唯一的字符串文字

    我有一个非常特殊的情况 我需要为类模板中声明的变量生成唯一的汇编程序名称 我需要该名称对于类模板的每个实例都是唯一的 并且我需要将其传递给asm关键字 see here https gcc gnu org onlinedocs gcc 12

随机推荐

  • 如何使用 mpsc 通道在线程之间创建环形通信?

    我想生成 n 个能够与环形拓扑中的其他线程通信的线程 例如线程 0 可以向线程 1 发送消息 线程 1 可以向线程 2 发送消息 等等 线程 n 可以向线程 0 发送消息 这是我想用 n 3 实现的示例 use std sync mpsc
  • c中的联合初始化

    我想知道联合变量是否会像结构变量一样被初始化 include
  • Typescript:在单独的文件中定义类及其方法

    是否可以在一个文件中声明一个类并在单独的文件中定义其方法 我有一些课程a lot方法 如果我能把它们分散一点那就太好了 简短回答 Typescript 不支持将类定义拆分为多个文件 解决方法 您可以定义一个包含类成员的接口 以及两个实现该接
  • 有谁遇到过“encodeURIComponent(string)”的跨浏览器问题

    我需要动态地从一些自定义字符串值创建 URL 我有疑问encodeURIComponent string https developer mozilla org en JavaScript Reference Global Objects
  • 体系结构 x86_64 的未定义符号:GCC

    我在我的 mac pro 上安装了 gcc 5 3 0 我想使用以下命令编译 c 程序 gcc main c o matrix mcmodel medium lm 但是我收到了这个错误 Undefined symbols for archi
  • Rails 资产管道和摘要价值

    有谁知道资产消化价值到底是怎么计算的吗 如果我有两个 JS 文件 其中包含各种其他包含的 JS 脚本 那么如果内部脚本都没有更改 每个文件是否会维护相同的摘要哈希 或者每次运行 asset precompile 操作时都会计算新的摘要值 接
  • 在 RStudio 中网络抓取 VIN 号码的品牌/型号/年份

    我目前正在开展一个项目 需要查找制造商 型号和 VIN 编号年份 我有 300 个不同 VIN 号码的列表 检查每个单独的 VIN 号码并将制造商 型号和年份手动输入到 Excel 中是非常低效且乏味的 我尝试使用带有 SelectorGa
  • 不使用循环打印 1 到 1000 [重复]

    这个问题在这里已经有答案了 我在 C 编程上下文中看到这个问题 我检查了一个解决方案 我的一位朋友给了我这段代码 它工作完美 但我无法理解它的逻辑以及它是如何工作的 我向他询问了这个问题 但他也不知道该程序实际上是如何工作的 我认为他也从某
  • 如何在 Play Framework 2.0 中使用 Evolutions?

    对于 1 x 版本 我们可以使用play evolutions apply 在 play 2 0 beta 中如何做到这一点 Evolution apply 在应用程序启动时自动运行 Play 2 0 rc1 缺少的是生成进化脚本并从 SB
  • 在 RSpec 请求规范中的每个请求之前设置标头

    如何在其中设置标题before each像下面这样 RSpec describe Users API type request do before each do host example org set a header for all
  • 更新对象时出现 HibernateOptimisticLockingFailureException

    我在更新对象时遇到以下异常 HibernateOptimisticLockingFailureException 类 用户 的对象 带有标识符 25614 乐观锁定失败 嵌套异常 是 org hibernate StaleObjectSta
  • Snowflake 中具有多个 JSON 对象的横向展平数组

    我有一个包含多个 JSON 对象的数组 表中任何 JSON 数组的最大元素数为 8 这是数组原始值的示例 variants id 12388362846279 inventory quantity 10 sku sku1 id 123883
  • 是否可以从命令行运行 Smalltalk 脚本?

    我发现了一个 可能过时且不正确 2004 年的博客文章 http www ianbicking org where smalltalk went wrong html它声称不可能从命令行运行 Smalltalk 脚本 从那时起有什么变化吗
  • 在 swift 中使用 TripleDes 和 MD5

    我有一个使用 TripleDes 和 MD5 的 Java 代码算法 这是我的java代码 private String encrypt String message String secretKey throws Exception Me
  • “找不到类型的属性”组合存储库 spring-data-neo4j

    我在用着spring data neo4j我正在尝试组合存储库以便能够使用自定义存储库 我认为我已经正确遵循了中指定的命名约定20 8 7 创建存储库 http docs spring io spring data neo4j docs 3
  • “双精度数组”和 TDoubleDynArray 之间的区别

    The System Typesunit 声明一个数组类型 TDoubleDynArray array of Double 如果我将一个方法声明为 procedure func x TDoubleDynArray 我注意到这个论点x行为就像
  • 使用 php ajax mysql 创建 3 个依赖下拉列表

    我正在使用 PHP MYSQL 和 JAVASCRIPT AJAX 我有多个下拉列表 我想使用 AJAX 使其相互依赖 其中这些下拉列表包含从 MYSQL 数据库检索的数据 用户从first下拉列表并根据其选择second and thir
  • 如何从矩阵中提取行名?

    我有一个行名称为日期的矩阵 我想将这些行名称提取到一个变量中 然后使用rownames 将这些日期应用到我拥有的另一个矩阵中 假设该矩阵称为 data matrix 每当我跑步时 data matrix 0 我得到了所有日期的打印输出 所以
  • Nodejs TCP连接客户端端口分配

    我使用nodejs在客户端和服务器之间创建了tcp连接 网络模块 https nodejs org api net html 服务器正在侦听已经预定义的端口 并且客户端正在连接到该端口 据我了解客户端的端口是由节点动态分配的 那是对的吗 节
  • 系统()的替代方案

    我最近开始接触C 编程 并且获得了很多经验 我过去的几个程序一直在使用 system 命令 我读过这应该是一个非常糟糕的主意 首先 为什么这是一个坏主意 我在 Linux 上使用它来执行诸如清除屏幕 例如 system clear 和启动程