Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does fork() result in duplicated output? [duplicate]

Tags:

c++

linux

fork

#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);
}
like image 375
COUNTERKILL Avatar asked Apr 08 '16 14:04

COUNTERKILL


1 Answers

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 insert std::endl, the stream doesn't get flushed until program exit. fork() causes the output stream to be duplicated, including unflushed contents. After the fork() there are 2 processes with unflushed output buffers containing the '1'. They each exit, flushing their buffers and you see "11".

like image 124
Rob K Avatar answered Nov 02 '22 21:11

Rob K