Процес в ОС UNIX - це програма, що запускається у власному віртуальному просторі адрес. Коли користувач входить в систему, автоматично створюється процес, в якому виконується програма інтерпретатора командного. Якщо командному інтерпретатору зустрічається команда, відповідна виконуваного файлу, то він створює новий процес і запускає в ньому відповідну програму, починаючи з функції main. Ця запущена програма, у свою чергу, може створити процес і запустити в ньому іншу програму (вона теж повинна містити функцію main) і т.д.
Для утворення нового процесу і запуску в ньому програми використовуються два системні виклики (примітиву ядра ОС UNI) - fork () і exec (ім'я-виконувані-файлу).Системный виклик fork призводить до створення нового адресного простору, стан якого абсолютно ідентична станом адресного простору основного процесу (тобто в ньому містяться ті ж програми і дані).
Іншими словами, відразу після виконання системного виклику fork основний і породжений процеси є абсолютними близнюками; управління і в тому, і в іншому знаходиться в точці, безпосередньо наступного за викликом fork. Щоб програма могла розібратися, в якому процесі тепер вона працює - основне або породженій, функція fork возвращает різні значення: 0 в породженій процесі і ціле додатне число (ідентифікатор породженого процесу) в основному процесі.
Тепер, якщо ми хочемо запустити нову програму в породженій процесі, потрібно звернутися до системного виклику exec, вказавши в якості аргументів виклику ім'я файлу, що містить нову виконувану програму, і, можливо, одну або кілька текстових рядків, які будуть передані в якості аргументів функції main нової програми. Виконання системного виклику exec призводить до того, що в адресний простір породженого процесу завантажується нова що виконується програма і з адреси, відповідного входу в функцію main.
У наступному прикладі користувача програма, що викликається як команда shell, виконує в окремому процесі стандартну команду shell ls, яка видає на екран вміст поточного каталогу файлів:
main () {
if (fork () == 0) wait (0); / * батьківський процес * /
else execl ("е", "е", 0); / * породжений процес * /
}