Если этот цикл занят ожиданием, я думаю, что вызов ожидания об этом позаботится.Если это так, как это можно исправить, чтобы не занято ждать?
id = fork();
for (i = 0; i < 20; i++)
{
switch (id)
{
case 0:
/* do stuff with child */
exit(0);
default:
{
if (children>=3) {
int s;
wait(&s);
children--;
}
children++;
id = fork();
}
}
}