Синопсис

# include <unistd>

pid_t fork (void);

Невдале виконання функції fork () можливе у випадку, коли система не володіє ресурсами для створення ще одного процесу. Це відбувається при пере­вищенні обмежень (якщо вони існують) на кількість дочірніх процесів, які мо­же породжувати батько, або на кількість процесів, які виконуються в межах всієї системи. В цьому випадку встановлюється змінна error, яка означає наяв­ність помилки.

2.2. Системні функції exec

Сімейство функцій exec призначене для заміни образу процесу, який йо­го викликає, образом нового процесу. При виклику функції fork () створює­ть­ся новий процес, який точною копією батьківського процесу, а функція exec () замінює образ ²скопійованого² процесу образом копії. Образ нового процесу є звичайний виконуваний файл, який миттєво завантажується на виконання. Цей файл можемо задати за допомогою імені і шляху доступу до нього. Функції сі­мейства exec можуть передавати новому процесу аргументи командної стрічки, а також встановити змінні середовища. Якщо функція виконалася успішно, во­на не повертає ніякого значення, оскільки образ процесу, який містить звертан­ня до функції exec, вже пере записано. У випадку невдачі процесу, який вик­ли­кає, повертається число -1. Всі функції exec () можуть мати невдале закінчення при наступних умовах:

· дозволи не визнано;

дозвіл на пошук відкидається для каталогу файлів, що виконуються;

дозвіл на виконання відкидається для файлу, який виконується;

· файли не існують;

файл, який виконується не існує;

каталог не існує;

· файл неможливо виконати;

файл неможливо виконати, оскільки він відкритий для запису іншим процесом;

файл не є виконуваним;

· проблеми з символічними посиланнями;

при аналізі шляху до файлу, що виконується, символічні посилання створюють цикл;

символічні посилання роблять шлях до файлу, який виконується, надто довгим.

Функції сімейства exec використовуються разом з функцією fork (). Фун­кція fork () створює та ініціює дочірній процес ²за образом і подібністю² бать­кі­вського. Образ дочірнього процесу в подальшому замінює образ свого предка за допомогою виклику функції exec (). Приклад використання функцій fork () і exec () показано в лістінгу 1.

// Лістінг 1. Використання системних функцій fork () і exec ()

// . . .

RtValue = fork ();

if (RtValue = = 0) {

execl (²/path/direct², ²direct², ² . ²);

}

В лістінгу 1 показано виклик функції fork (). Значення, які вона повер­тає, зберігається у змінній RtValue. Якщо значення RtValue рівне 0, отже, це – дочірній процес, і в ньому викликається функція execl () з параметрами. Пер­ший параметр містить шлях до модуля, який виконується, другий – інструкцію, для виконання, третій – аргумент. Другий параметр, direct, являє собою ім'я утиліти, яка перераховує всі каталоги і підкаталоги з даного каталогу. Всього існує шість версій функції exec, передбачених для використання різних угод про виклики.

 

2.3. Функції execl ()

Функції execl (),execle () і execlp () передають функції командної стрічки у вигляді списку. Кількість аргументів командної стрічки повинна бути відома під час компіляції.

· int execl (const char *path, const char *arg0, . . ./*, (char *)0 */);

Тут path – дорожнє (шляхове) ім'я програми, яка виконується. Його мо­жна подати у вигляді повного складеного імені або відносного складеного імені з біжучого каталогу. Наступні параметри є списком аргументів командної стрі­ч­ки, від arg0 до argn. Всього може бути n аргументів. Даний список завер­шу­є­ть­ся NULL-вказівником.

· int execle (const char *path, const char *arg0, . . ./*, (char *)0 *, char * const envp[]*/);

Дана функція аналогічна функції execl () з однією відмінністю: вона має додатковий параметр, envp[]. Цей параметр вказує на нове середовище для нового процесу, тобто envp[] – це вказівник на стрічковий масив з завершаль­ним нульовим символом. Кожна його стрічка, також завершується нульовим символом, має наступну форму

name = value

Тут name – ім'я змінної середовища, а value – стрічка що зберігається. Значення параметру envp[] можемо присвоїти наступним чином:

char *const envp[]={“PATH=/opt/kde2:/sbin”, “HOME = /home”, NULL};

Тут PATH і HOME – змінні середовища.

· int execlp (const char *fale, const char *arg0, . . ./*, (char *)0 */);

Тут fale – ім'я програми, яка виконується. Для визначення місця знахо­дження програм, що виконуються, використовується змінна середовища PATH. Останні параметри є списком аргументів командної стрічки (дивись опис фун­кції execl ()).

Приклад застосування синтаксису функції execl () зрізними аргумента­ми:

char *const args[] = {“direct”, “.”, NULL};

char *const envp[] = {“fales=50”, NULL};

execl (“path/direct”, “direct”, “.”,NULL);

execle (“path/direct”, “direct”, “.”,NULL, envp);

execlp (“direct”, “direct”, “.”,NULL);

Тут в кожному прикладі виклику execl-функції активізований процес викликає програму direct.