函数system()如何在c ++中工作?

时间:2015-07-28 11:16:52

标签: c++

我试图理解使用system(“some command”)在c ++中进行的系统调用。这是代码

#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
  cout << "Hello ";
  system("./pause");
  cout << "World";
  cout << endl;

  return 0;
}

可执行文件“pause”是从以下代码

创建的
#include <iostream>
using namespace std;

int main()
{
    cout<<"enter any key to continue\n";
    cin.get();
    return 0;

}

我得到以下输出

enter any key to continue
1
Hello World

有人可以向我解释输出吗?我在期待这个 -

Hello
enter any key to continue
1
World

4 个答案:

答案 0 :(得分:5)

您观察到的特定行为的原因似乎只是cout缓冲:Hello不会立即打印,而是保留在缓冲区中,直到输出endl(或缓冲区完全填满,或者您明确调用flush())。这与system()电话无关。

一个更简单的例子:

cout << "Hello";
sleep(10);
cout << "World";

两个单词将同时出现,而不会延迟10秒。

答案 1 :(得分:5)

这可能不是系统调用的情况,而是输出流缓冲。

cout << "xxx"不需要输出内容,因此system调用的程序可以在cout将缓冲区刷新到控制台之前执行。

尝试在cout.flush()之后添加cout << "Hello"或写cout << "Hello" << flush

另外:cout << endl自动调用flush

答案 2 :(得分:5)

system在shell中运行命令。但问题不在于system,而在于coutcout是行缓冲的,即。它将不会刷新(写出)其数据,直到遇到新的行字符。您需要使用cout << flush明确地刷新它。

答案 3 :(得分:4)

答案&#34; system库函数如何工作?&#34;通常是特定于操作系统的。有关Linux的观点,请参阅here。请注意system a system call并且在使用system(3)和刷新cout缓冲区之间存在先验无关。

您应该在调用system

之前刷新标准输出
 cout << "Hello " << flush;

或者最好

 cout << "Hello " << endl;

您正在观察的行为是因为cout 缓冲而您忘记刷新缓冲区。