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

ase*_*s93 5 c++

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

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

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

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

可执行文件"pause"是从以下代码创建的

#include <iostream>
using namespace std;

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

}
Run Code Online (Sandbox Code Playgroud)

我得到以下输出

enter any key to continue
1
Hello World
Run Code Online (Sandbox Code Playgroud)

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

Hello
enter any key to continue
1
World
Run Code Online (Sandbox Code Playgroud)

Pet*_*etr 5

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

一个更简单的例子:

cout << "Hello";
sleep(10);
cout << "World";
Run Code Online (Sandbox Code Playgroud)

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


Hco*_*org 5

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

cout << "xxx"没有必要输出一些东西,所以system可以在cout将缓冲区缓冲到控制台之前执行被调用的程序.

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

还:cout << endl自动呼叫flush


Ste*_*oft 5

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


Bas*_*tch 4

system关于“库函数如何工作?”的答案 通常是特定于操作系统的。请参阅此处了解 Linux 观点。请注意,system不是系统调用,并且使用system(3)和刷新缓冲区之间没有先验的关系。cout

您应该在调用之前刷新标准输出system

 cout << "Hello " << flush;
Run Code Online (Sandbox Code Playgroud)

或者最好是

 cout << "Hello " << endl;
Run Code Online (Sandbox Code Playgroud)

您观察到的行为是因为cout缓冲并且您​​忘记刷新缓冲区。