Разбор и примеры использования функций которые разрешено использовать по сабжекту.
Навигатор по функциям:
fork - создает дочерний процес, а при ошибке возвращает -1.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h> // для unix функций
int main(int argc, char* argv[])
{
int id = fork();
printf("Hi school 21 id: %d\\n", id);
return 0;
}
При использовании функции fork() , код как бы делится на две части, на родительский и дочерний процесс. В родительском процессе fork вернет id дочернего, а в дочернем всегда будет возвращаться 0. Но фактический id у дочернего процесса будет тот который fork вернет у родительского, а id родительского можно посмотреть например в системном мониторинге

Но сейчас это не важно. Да и поймать в мониторинге программку a.out за время её выполнения в пол секунды нереально.
Пример использования условий в процессах
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h> // для unix функций
int main(int argc, char* argv[])
{
int id = fork();
if (id == 0)
printf("child process\\n");
else
printf("main process\\n");
return 0;
}
Каждый процесс можно делить снова и снова
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h> // для unix функций
int main(int argc, char* argv[])
{
fork();
fork();
printf("Hi school 21\\n");
return 0;
}
2 форка - дадут 4 процесса. 4 форка - дадут 16 процессов Это 2 в степени n (2^n) 9 форков это 512 процессов

Можно быстро посчитать на калькуляторе в режиме cmd+2 через функцию x^y
Что бы создать три процесса, можно использовать условие разрешающее делать форк только процессу не с нулевым id
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h> // для unix функций
int main(int argc, char* argv[])
{
int id = fork();
if (id != 0)
{
fork();
printf("main process id = %d\\n", id);
}
else
printf("child process id = %d\\n", id);
return 0;
}