Первое, что нужно заметить, анализируя эту проблему в том, что нет блокировки вызовов, это означает, что, когда основной процесс достигает конца основная программа завершится, независимо от того, в каком состоянии находятся другие процессы.
Используя этот факт, мы можем разработать нижний предел m
: это произойдет, когда разветвленные процессы не изменят e значение m
до выхода основного процесса. В этом случае m начнется с 3 и будет добавлено до 4 раз в цикле, что даст вам нижний предел m = 7
.
Верхний предел будет происходить, когда все процессы будут порождены до того, как кто-либо вступит в цикл, а затем каждый процесс добавит от 4 до m
(который будет иметь начальное значение 3). Другими словами, m = 3 + N*4
, где N
- общее количество процессов, порожденных.
Чтобы наконец получить верхний предел, нам нужно знать, сколько процессов порождено. Первый вызов fork()
превратит один процесс в два, и последующий вызов fork()
превратит каждый из этих процессов в два, что означает, что N = 4
.
Используя наше выражение для m
от до этого мы видим, что верхний предел m = 3 + 4 * 4 = 19
@KerrekSB Наверное мне нужно кофе, но не должно быть '7' значение' M' в конце каждого процесса ? – LPs
То, что вы помните, является, вероятно, не тем, что было, потому что нет возврата к основному, а fork просто дублирует все в этой программе. Таким образом, все 4 программы завершатся с m = 7. –
Я собирался ответить на это, но [поскольку глобальные переменные не разделяются] (https://stackoverflow.com/questions/4298678/after-forking-are-global-variables-shared), 'm' будет' 7 'в конце каждого клона. Если мы предположим, что [мы разделяем переменную] (http://stackoverflow.com/q/13274786/1270789), то переменная будет всегда '11', я думаю, за исключением того, что, поскольку одна копия может читать переменную одновременно с напишите, может возникнуть непредвиденное поведение. Это очень плохой вопрос для экзамена! BTW, 'fork(); fork(); m = 3;' может давать от 7 до 19, предполагая общую память и т. Д. –