Вы не можете выполнить разветвление, вероятно, потому что вы установили пользовательское или системное ограничение на количество процессов, которые вы можете создать. Причина этого заключается в том, что, пока вы заставляете детей правильно выходить из себя, вы не «ждете» их потом в родителе. Это означает, что процесс не очищается и для него выделяются определенные ресурсы.
Один из способов справиться с этим - заставить родителя ответить на SIGCHLD, который является сигналом, который ОС отправляет родителю, чтобы сообщить ему о прекращении ребенка.
Используя пример из https://beej.us/guide/bgnet/html/multi/clientserver.html#simpleserver, вы добавляете функцию для ОС для вызова события, а затем используете вызов sys для информирования ОС о своем намерении использовать эту функцию для этого сигнала.
Вы добавляете
void sigchld_handler(int s)
{
// waitpid() might overwrite errno, so we save and restore it:
int saved_errno = errno;
while(waitpid(-1, NULL, WNOHANG) > 0);
errno = saved_errno;
}
и в какой-то момент своей основной функции вы выполняете
struct sigaction sa;
sa.sa_handler = sigchld_handler; // reap all dead processes
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
if (sigaction(SIGCHLD, &sa, NULL) == -1) {
perror("sigaction");
exit(1);
}
Приятно то, что вы можете использовать этот метод, чтобы реагировать на другие сигналы от ОС, а также распространять его после смерти ребенка.