На основе замечаний по этому вопросу, ответ в том, что fork
в ideone.com онлайна компилятора просто ограничивая вас один экземпляр вашего процесса, и буферный свой выход.
Update: На самом деле, это также лежа: http://ideone.com/oXqqwM показывает, что fork()
претендует на успех, но только первый создает новую копию процесса.
Я подозреваю, что если вы проверили возвращенные значения fork()
вы бы получить некоторые подсказки, как к удивительному поведению, что вы видите - все, кроме первого будет возвращено -1 - и если вы использовали std::endl
вместо вас мог избегать первого *
.
Ожидаемый результат: каждый fork()
дублирует текущий процесс в этот момент, и поэтому вы ожидаете увидеть дважды каждый символ по сравнению с предыдущим, за исключением того, что буферизация означает, что вы все еще можете иметь предыдущие символы в буфере при время fork()
.
Так что ожидайте 1 или более «*», 2 или более «A», 4 или более «B» или 8 или более «C», за исключением того, что если fork()
терпит неудачу, номера будут закрыты.
Ваше ожидание 1 «*», 2 «А», 3 «Б» и 4 «C» указывает на то, что вы упускать из виду, что оба процессы, выходящие из fork()
выйдет следующий fork()
, поэтому вы дважды, а не увеличивать на единицу.
Я бы ожидал * A B C * A B C * A B C * A B C * A B C * A B C * A B C * A B C из-за буферизации. – immibis
Это неопределенно. Если вам нужен конкретный заказ, вам нужно использовать детерминированные методы, а не многопроцессорную обработку. И поведение определяется операционной системой, а не C++. – EJP
Я не могу воспроизвести ваши результаты с помощью g ++ или clang ++ локально. Какой компилятор вы использовали, и на какой операционной системе?Я получил 1 *, 2 A, 4 B и 8 C, чего вы должны ожидать _actually_, так как каждый fork() разбивает процесс на два. – TBBle