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

Gor*_*son 7 c++ windows operating-system system dos

我经常听说使用system("PAUSE")是不好的做法std::cin.get()而是使用.现在我对系统调用的理解是它们将一个字符串输入到系统命令行并与操作系统通信,因此PAUSE是一个DOS命令,用于暂停命令窗口中的输出.我认为这与Mac和使用不同关键字的unix类似,并且由于缺乏跨操作系统兼容性而不鼓励使用系统调用.(如果我错了,请纠正我)

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

Sin*_*ion 28

system("PAUSE")当然不太理想.使用对系统的调用会创建一个子进程,在Windows上它是相当昂贵的,并且在任何情况下在任何操作系统上都不是非常便宜.在嵌入式系统上,内存开销很大.

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

此外,它在所有c ++编译器的操作系统上都可以正常工作,因为它只使用非常标准的语言部分的一个非常基本的功能,而不是依赖于操作系统提供的任何东西.

编辑:预测你的担心,如果它是昂贵的无关紧要,因为整个想法是暂停.好吧,首先,如果它很昂贵,那么它会损害其他任何可能发生的性能.曾经注意到(在Windows上)当一个应用程序启动时,其他已打开的应用程序也会变得不那么敏感吗?此外,您的用户可能不是真人,而是代表人类用户工作的另一个程序(Say,shell脚本).脚本已经知道下一步该做什么,并且可以用字符预先填充标准输入以跳过等待.如果您在此处使用了子进程,则脚本将遇到(明显是人类)延迟.如果脚本正在执行数百次(或数亿次!)次,那么现在需要几秒钟才能运行的脚本需要数天或数年.

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

在unixy系统上,大多数子进程都会发生,fork因为它允许同一个程序在两个独立进程的同一个地方继续运行,一个作为另一个进程的子进程(除非你从操作系统请求它,否则很难注意到).在Linux上,这是特别优化的,并且与创建pthread一样便宜.即使在没有这么快的系统上,它仍然非常有用(如apache流程池方法所示)(在Windows/链接到unix文档时不可用)

其他情况(在Windows上也是如此!)通常由函数popenexec函数族处理. popen创建一个子进程和一个连接到子进程的stdin或stdout的全新管道.然后父进程和子进程可以同时运行并且非常容易通信.(链接到windows docs/链接到unix文档)

exec*函数族(有几个,execl,execv等)另一方面导致当前程序被新程序替换.原始程序无形地退出,新程序接管.当新进程返回时,它将返回到所谓的原始进程,就好像该进程在那时返回而不是消失.这样做的好处exit(system("command"))是没有创建新进程,节省了时间和内存(虽然并不总是非常多)(链接到windows docs/链接到unix文档)

system可能会被某些脚本工具用来调用某些配方操作中的几个步骤.例如,在某个时刻,程序可以system用来调用文本编辑器来编辑某些配置文件.它不需要过多关注所发生的事情,但它应该等到用户保存并关闭编辑器之后再继续.然后它可以使用返回值来查明编辑会话是否成功,在编辑器实际打开所请求的文件的意义上(并且编辑器本身完全存在!),但是将从中读取实际的会话结果直接编辑的文件,而不是与子进程通信.(链接到windows docs/链接到unix文档)