2015-11-09 3 views
1

im узнает о fork(), но что-то работает неправильно в моей ubuntu. им работает этот код:fork(), всегда работает родительский, а потом ребенок

#include <stdio.h> 
#include <unistd.h> 

int main(int argc, char **argv) 
{ 
printf("--beginning of program\n"); 

int counter = 0; 
pid_t pid = fork(); 

if (pid == 0) 
{ 
    // child process 
    int i = 0; 
    for (; i < 5; ++i) 
    { 
     printf("child process: counter=%d\n", ++counter); 
    } 
} 
else if (pid > 0) 
{ 
    // parent process 
    int j = 0; 
    for (; j < 5; ++j) 
    { 
     printf("parent process: counter=%d\n", ++counter); 
    } 
} 
else 
{ 
    // fork failed 
    printf("fork() failed!\n"); 
    return 1; 
} 

printf("--end of program--\n"); 

return 0; 
} 

я знаю, родитель и ребенок должен запустить свой код в произвольном порядке, так что код должен вернуть что-то вроде этого:

-beginning of program 
parent process: counter=1 
parent process: counter=2 
parent process: counter=3 
child process: counter=1 
parent process: counter=4 
child process: counter=2 
parent process: counter=5 
child process: counter=3 
child process: counter=4 
child process: counter=5 
--end of program-- 

Но каждый раз, когда я запустить программу , они работают в том, что, похоже, является одним и тем же порядком. здесь происходит захват того, что я получаю каждый раз, когда я запустить эту программу:

[email protected]:~/Documents/S-O$ ./sample 
--beginning of program 
parent process: counter=1 
parent process: counter=2 
parent process: counter=3 
parent process: counter=4 
parent process: counter=5 
--end of program-- 
[email protected]:~/Documents/S-O$ 
child process: counter=1 
child process: counter=2 
child process: counter=3 
child process: counter=4 
child process: counter=5 
--end of program-- 

похоже на родительском финиш первого, а затем ребенок начинает. но я думаю, что это не так. обратите внимание, что вторая подсказка оболочки открывается самой программой. любые идеи о том, что может произойти?

Edit:

если я положить sleep(1) это работает просто отлично. я все еще думаю, что без задержки он не всегда должен иметь один и тот же порядок выполнения. даже считая до 100, он дает то же самое

+1

Что происходит, когда вы используете большие цифры? Бросьте спать там на каждом цикле и посмотрите, что произойдет. – ChiefTwoPencils

+1

Вы пробовали подсчет> 5? – John3136

+0

, когда я использую большее число, он делает то же самое. – angel208

ответ

1

Да, родители и дети запускают свой код в почти непредсказуемом порядке (помните, что нет случайности), но ваш планировщик, вероятно, после форвок может выбрать график родительского и то ребенок. Поскольку оба имеют очень маленький код, родитель может запускать весь свой код, а затем детей. Чтобы экспериментировать с чем-то другим, вы должны делать что-то гораздо более продолжительное после разветвления в обоих процессах (например, вы сможете увидеть различные перемежения выходов).

Запрос не создается кодом, но является его следствием. Когда родительский процесс умирает, запускаемая оболочка получает контроль и запрашивает другую команду, в то время как дети работают и загрязняют ваш терминал. Ребенок стал сиротским процессом. Чтобы этого не произошло, вы должны сообщить родителям, чтобы он подождал своего ребенка, вызвав ... wait().

Смежные вопросы