This question already has an answer here:
- fork() and output 8 answers
#include <iostream>
#include <unistd.h>
#include <stdlib.h>
int main() {
std::cout << 1;
fork();
exit(0);
}
The fork
is located after streaming into cout
, but this code prints 11.
Why? And why does the code only print 1 if std::endl
is added to cout
?
#include <iostream>
#include <unistd.h>
#include <stdlib.h>
int main() {
std::cout << 1 << std::endl;
fork();
exit(0);
}
It's caused by stream buffering. Inserting
std::endl
into the stream causes it to be flushed, so when you fork, the stream buffer is empty. When you don't insertstd::endl
, the stream doesn't get flushed until program exit.fork()
causes the output stream to be duplicated, including unflushed contents. After thefork()
there are 2 processes with unflushed output buffers containing the '1'. They each exit, flushing their buffers and you see "11".