несколько вилок в Unix - PullRequest
       12

несколько вилок в Unix

3 голосов
/ 09 октября 2011
main() {
     fork();
     fork();
     printf("Hello world\n");
}

В приведенной выше программе родительский процесс порождает дочерний процесс.Дочерний процесс, в свою очередь, порождает процесс внука.После выполнения этой программы я получаю следующий вывод:

Macintosh:unix NightFury$ ./a.out 
Hello world
Hello world
Hello world
Macintosh:unix NightFury$ Hello world

Почему вывод не является выходом одного процесса?да, должно быть напечатано 4 «Hello world», но почему последний печатается как отдельный процесс?

Ответы [ 2 ]

4 голосов
/ 09 октября 2011

Оболочка ожидает завершения процесса сначала , а затем снова печатает приглашение оболочки.У вас запущены три других процесса, и в это время два из них написали свои выходные данные до появления приглашения оболочки, а один - после.Ситуация может не происходить в этом точном порядке при каждом запуске вашей программы - иногда вы можете получить приглашение оболочки раньше или позже, чем в этом примере.

Именно так вы можете писать программы, которые продолжают работать в "фоне".».

1 голос
/ 09 октября 2011

Они фактически печатаются как единое целое, но родительский процесс умер, и поэтому оболочка печатает строку «Macintosh: unix NightFury $», а последний оставшийся дочерний процесс печатает свою строку после этого. На самом деле вы должны попытаться сделать это, добавив строку, в которой вы просите родительский процесс подождать, пока не погибнет каждый ребенок, тогда такой строки не должно быть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...