Відкрити головне меню

Процес в ОС 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("ls", "ls", 0); /* породжений процес */ 
}

Див. такожРедагувати