Согласно комментарию, который вы сделали в ответе @ Cristina, проблема в том, что он разветвляет 20 child2 вместо только 5, как указано в аргументе командной строки. Причина в том, что каждый дочерний процесс, созданный forkChildren
, возвращается к main
и вызывает forkChildren2
. Вы получаете 20 (фактически 25) child2, потому что 4 (forkChildren) * 5 (forkChildren2) = 20 плюс 5, созданных родительским процессом.
Я добавил возвращаемые значения в функции (в обе, чтобы они оставались одинаковыми) и условие if
, чтобы пропустить forkChildren2
, если это дочерний процесс.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int forkChildren(int nChildren) {
int i;
pid_t pid;
for (i = 1; i <= nChildren; i++) {
pid = fork();
if (pid == -1) {
/* error handling here, if needed */
return -1;
}
if (pid == 0) {
printf("I am a child: %d PID: %d\n",i, getpid());
sleep(5);
return 1;
}
}
return 0;
}
int forkChildren2(int nChildren) {
int i;
pid_t pid;
for (i = 1; i <= nChildren; i++) {
pid = fork();
if (pid == -1) {
/* error handling here, if needed */
return -1;
}
if (pid == 0) {
printf("I am a child2: %d PID: %d\n", i, getpid());
sleep(2);
return 1;
}
}
return 0;
}
int main(int argc, char **argv) {
int ret;
if (argc != 3) {
fprintf(stderr, "Usage: %s <nChild> <nChild2>\n", getprogname());
return EXIT_FAILURE;
}
ret = forkChildren(atoi(argv[1]));
if (ret == 0)
forkChildren2(atoi(argv[2]));
// wait(...) for all pids here, if you wish
return EXIT_SUCCESS;
}