В начале argv
будет указывать на argv[0]
, которое является именем исполняемого файла, оно увеличивается один раз внутри while()
, указывая на argv[1]
.
Теперь он нажимает fork()
, создавая второй поток, начинающийся с той же строки.
Оба потока будут записывать a
в свой собственный буфер stdout
.
Теперь argv
перемещается на 1 символ в обоих случаях (внутри while()
), поскольку они, по сути, работают с копиями, если я правильно помню.
Форк в каждом потоке теперь создаст 2 дополнительные копии потока (по одной для каждого существующего потока).
Теперь все 4 экземпляра будут иметь в своем буфере stdout
все еще 'a', который копируется (думаю, было бы неплохо, если бы кто-нибудь мог это подтвердить), и их argv
указывает на b
. Этот тоже написан, так что теперь у нас есть 4 потока, каждый из которых имеет «a b» в своих выходных буферах.
Как только они заканчиваются, их буферы сбрасываются, что приводит к 'a b a b a b a b' (по существу, это 'a b', 'a b', 'a b' и 'a b').
Комментарий Бена можно объяснить покраснением, вызванным разрывом строки.