我试图理解使用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)
您观察到的特定行为的原因似乎只是cout缓冲:Hello不会立即打印,而是保存在缓冲区中直到endl输出(或缓冲区完全填充,或您明确调用flush()).这与system()电话无关.
一个更简单的例子:
cout << "Hello";
sleep(10);
cout << "World";
Run Code Online (Sandbox Code Playgroud)
两个单词将同时出现,而不是延迟10秒.
它可能不是系统调用的情况,而是输出流缓冲.
cout << "xxx"没有必要输出一些东西,所以system可以在cout将缓冲区缓冲到控制台之前执行被调用的程序.
尝试添加cout.flush()之后cout << "Hello"或写入cout << "Hello" << flush
还:cout << endl自动呼叫flush
system在shell中运行命令.但你的问题不在于,system而在于cout.cout是行缓冲的,即.它将不会刷新(写出)其数据,直到遇到新的行字符.你需要明确地用它来冲洗它cout << flush.
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已缓冲并且您忘记刷新缓冲区。
| 归档时间: |
|
| 查看次数: |
537 次 |
| 最近记录: |