fork()
Примітив часто тягнеться уяву. Поки ви не відчуєте це, вам слід простежити на папері, що таке кожна операція, і врахувати кількість процесів. Не забувайте, що fork () створює майже ідеальну копію поточного процесу. Найбільш суттєвою відмінністю (для більшості цілей) є те fork()
, що значення повернення відрізняється між батьком і дитиною. (Оскільки цей код ігнорує повернене значення, це не має значення.)
Отже, спочатку є один процес. Це створює другий процес, який друкує крапку і цикл. Під час своєї другої ітерації кожен створює ще одну копію, тому є чотири процеси, надрукуючи крапку, а потім вийдіть. Тож ми можемо легко нарахувати шість крапок, як ви очікуєте.
Однак те, що printf()
насправді робить, є захистом його результатів. Тож перша точка з того часу, коли було лише два процеси, не з’являється при написанні. Ці точки залишаються в буфері, який дублюється на fork (). Лише поки процес не вийде, з'являється буферизована точка. Чотири процеси друку буферизованої точки, плюс нова дає 8 крапок.
Якщо ви хотіли уникнути такої поведінки, телефонуйте fflush(stdout);
після printf()
.