代码之家  ›  专栏  ›  技术社区  ›  Gordon Gustafson

C++中的调用及其在编程中的作用

  •  7
  • Gordon Gustafson  · 技术社区  · 15 年前

    我经常听说使用 system("PAUSE") 是不好的做法和使用 std::cin.get() 相反现在我对系统调用的理解是,它们将一个字符串输入系统命令行并与操作系统对话,因此PAUSE是一个DOS命令,用于在命令窗口中暂停输出。我假设这同样适用于具有不同关键字的Mac和unix,并且由于缺乏跨操作系统兼容性,不鼓励使用系统调用。(如果我有任何错误,请纠正我)

    我的问题是:什么时候使用system()调用合适?它们应该如何应用?什么时候不应该应用它们?

    6 回复  |  直到 14 年前
        1
  •  31
  •   SingleNegationElimination    15 年前

    system("PAUSE") 这显然不太理想。使用对系统的调用创建一个子进程,在windows上相当昂贵,在任何操作系统上都不便宜。在嵌入式系统上,内存开销非常大。

    如果有什么方法可以让你在没有太多痛苦的情况下完成这件事,那就去做吧。在等待用户按下一个按钮的情况下,cin.get()将很难被击败。在这种情况下,应用程序进程只会阻塞stdin,只设置内核可见的几个标志,最重要的是,不会分配新内存,也不会创建新的调度实体,甚至不会创建中断处理程序。

    主意

    system() :当您需要做另一个流程所做的事情时,您无法轻松完成。 系统() 并不总是最好的选择,因为它做了两件有点限制的事情。首先,与子流程通信的唯一方法是将命令行参数作为输入,将返回值作为输出。第二个是父进程阻塞,直到子进程完成。这两个因素限制了系统可用的情况。

    在unixy系统上,大多数子进程都是在 fork 因为它允许同一个程序作为两个独立的进程在同一个地方继续运行,一个进程是另一个进程的子进程(除非您从操作系统请求,否则这很难注意到)。在Linux上,这是特别优化的,而且与创建pthread一样便宜。即使在速度不快的系统上,它仍然非常有用(如apache进程池方法所示)(在windows上不可用)/ link to unix docs )

    popen exec 函数族。 波本 创建子流程和连接到子流程的标准输入或标准输出的全新管道。然后,父进程和子进程都可以并发运行,并且可以非常轻松地进行通信。( link to windows docs / link to unix docs )

    执行官 *另一方面,函数族(有几个、execl、execv等)导致当前程序被新程序替换。原始程序无形中退出,新进程接管。当新进程返回时,它将返回到称为原始进程的任何进程,就好像该进程在该点返回而不是消失一样。这个的优点是什么 exit(system("command")) 就是不创建新流程,节省时间和内存(虽然并不总是非常多)( link to windows docs / link to unix docs )

    system 可能会被一些脚本化工具用来调用某些配方操作中的几个步骤。例如,在某一点上,程序可以使用 调用文本编辑器来编辑某些配置文件。它不必过多地关注所发生的事情,但它肯定应该等到用户保存并关闭编辑器后再继续。然后,它可以使用返回值来确定编辑会话是否成功,即编辑器实际打开了请求的文件(并且编辑器本身存在!),但将直接从编辑的文件中读取会话的实际结果,而不是与子进程通信。( link to windows docs / link to unix docs )

        2
  •  3
  •   Prashast    15 年前

    您应该避免使用此类调用,因为这会降低您的程序与其他操作系统协同工作的可移植性。我认为只有当你绝对确定你的代码是针对一个特定的操作系统时,你才应该使用这样的调用。

        3
  •  3
  •   Jherico    15 年前

    但我的问题是:何时使用system()调用合适?它们应该如何应用?

    当您无法使用自己的代码或库完成您试图完成的任务时(或者实现它的成本超过启动新流程的成本)。与cin.get()相比,system()在系统资源方面非常昂贵,因此它应该只在绝对必要时使用。请记住,system()通常会启动整个新shell和您要求它运行的任何程序,因此会启动两个新的可执行文件。

        4
  •  3
  •   dk1844    12 年前

    顺便说一句 系统() 调用不应与具有 起诉 SGID 位集,从 man page

    不要从具有设置用户ID或设置组ID的程序中使用system() 特权,因为某些环境变量的值很奇怪 可能被用来破坏系统完整性。使用exec(3)系列的 而是函数,但不是execlp(3)或execvp(3)。system()不会, 事实上,可以通过设置用户ID或设置组ID的程序正常工作 自bash 2之后,/bin/sh为bash版本2的系统上的权限 在启动时删除特权。

        5
  •  2
  •   Jean Marcos Michael J    11 年前

    system() 用于要求操作系统运行程序。

    为什么您的程序希望操作系统运行程序?嗯,有一些案例。有时,外部程序或操作系统命令可以执行在您自己的程序中很难执行的任务。例如,外部程序可能以提升的权限运行或访问适当的数据格式。

    系统() 函数本身是相当可移植的,但是您传递给它的命令字符串可能非常特定于平台——尽管可以从本地配置数据中提取命令字符串,使其更不受平台的影响。

    其他功能如 fork() , exec*() , spawn*() CreateProcess() 将使您能够更好地控制运行外部程序的方式,但这些程序是特定于平台的,可能无法在您选择的平台上使用。

    system("PAUSE") 这是一个古老的DOS把戏,现在通常被认为是相当粗俗的风格。

        6
  •  1
  •   Deinumite    15 年前