В приведенном ниже коде вилки фактически работают параллельно или один за другим?
В чем смысл wait(NULL)
?
(Программа создает n число дочерних процессов, n передается через командную строку)
int main ( int argc, char *argv[] ) { int i, pid; for(i = 0; i < atoi(argv[1]); i++) { pid = fork(); if(pid < 0) { printf("Error occured"); exit(1); } else if (pid == 0) { printf("Child (%d): %d\n", i + 1, getpid()); exit(0); } else { wait(NULL); } } }
Они работают параллельно, вплоть до того момента, когда один из них ждет.
wait(NULL)
или более точно wait(0)
означает ждать до изменения состояния в дочернем процессе. Чтобы узнать о вызовах Unix / Linux C api, введите man
в командной строке. Вам нужно будет привыкнуть к чтению этих страниц, поэтому лучше начать сейчас.
В твоем случае
man wait
дал бы вам то, что вам нужно.
Поскольку у вас есть только fork(...)
ed один раз, у вас есть только один ребенок. Родитель ждет, пока он не изменит состояние, и поскольку состояние дочернего элемента во время вилки совпадает с состоянием родителя перед развилкой ( побегом ), вероятным результатом является то, что родитель ждет, пока ребенок не умрет. Затем родитель продолжит выполнение, но поскольку после wait(...)
он не сможет многое сделать, он также быстро выйдет.