Как работают вызовы C fork () и wait ()? - PullRequest
2 голосов
/ 22 ноября 2011

** псевдокод!

fork();
printf(--print process ID);
fork();
printf(--print process ID);
fork();
printf(--print process ID);

Это ... Я предполагаю, что результаты в 8 процессах сегодня (поправьте меня, если я ошибаюсь).

Теперь, если к этому добавятся ожидающие вызовы, что произойдет?

fork();
wait(..);
printf(--print process ID);
fork();
wait(..);
printf(--print process ID);
fork();
wait(..);
printf(--print process ID);

Я думаю, что оба: 1) количество процессов будет одинаковым и 2) отпечатки printf() также будут выглядеть одинаково?

1 Ответ

3 голосов
/ 22 ноября 2011

True.Вызов ожидания будет накладывать некоторые ограничения на порядок выполнения процессов, но у вас все равно будет 8 процессов.Операторы printf будут выглядеть одинаково, но порядок, в котором они могут измениться.

В первой версии возможно, но не гарантируется, что все 8 процессов будут выполняться одновременно, в версии с ожиданиемчисло параллельных процессов, безусловно, никогда не достигнет 8.

В моей системе wait () будет возвращаться только после завершения прямых потомков, так что ваша версия с wait будет печататься детерминистически: дети всегда будут завершаться, прежде чем родители продолжат.1005 *

Как правило, вы увидите

N+1 //first printf
N+2 //second printf
N+3 //third printf
N+2 //third printf
N+1 //second printf
N+4 //third printf
N+1 //third printf
N   //first printf
N+5 //second printf
N+6 //third printf
N+5 //third printf
N   //second printf
N+7 //third printf
N   //third printf

, где N - pid корневого процесса.Получение хорошего блока смежных номеров PID зависит от обычной схемы назначения pid, которую я обычно наблюдаю в * nix системах, и когда мне не удается запустить какой-то другой процесс во время работы вашей игрушечной программы.

Я не знакомс достаточным разнообразием операционных систем, чтобы сказать 100%, что вы никогда не встретите wait (), который пожнет внуков, но я был бы очень удивлен, услышав об этом.

...