Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
практична робота 8.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
232.96 Кб
Скачать

Поняття групи процесів, сеансу, лідера групи, лідера сеансу, управляючого терміналу сеансу. Системні виклики getpgrp(), setpgrp(), getpgid(), setpgid(), getsid(), setsid()

В лекції 2, розділ "Одноразові операції", вже мовилося, що всі процеси в системі зв'язані спорідненими відносинами і утворюють генеалогічне дерево або ліс з таких дерев, де як вузли дерев виступають самі процеси, а зв'язками служать відносини батько-дитина. Всі ці дерева прийнято розділяти на групи процесів, або сім'ї (див. рис. 13–14.1).

Група процесів включає один або більш процесів і існує, поки в групі присутній хоча б один процес. Кожний процес обов'язково включений в яку-небудь групу. При народженні нового процесу він потрапляє в ту ж групу процесів, в якій знаходиться його батько. Процеси можуть мігрувати з групи в групу по своєму бажанню або за бажанням іншого процесу (залежно від версії UNIX). Багато системних викликів можуть бути застосовано не до одного конкретного процесу, а до всіх процесів в деякій групі. Тому те, як саме слід об'єднувати процеси в групи, залежить від того, як передбачається їх використовувати. Трохи пізніше ми поговоримо про використовування груп процесів для передачі сигналів.

Мал. 13-14.1.  Ієрархія процесів в UNIX

У свою чергу, групи процесів об'єднуються в сеанси, утворюючи, із спорідненої точки зору, якісь клани сімей. Поняття сеансу спочатку було введено в UNIX для логічного об'єднання груп процесів, створених в результаті кожного входу і подальшої роботи користувача в системі. З кожним сеансом, тому, може бути зв'язаний в системі термінал, званий управляючим терміналом сеансу, через який звичайно і спілкуються процеси сеансу з користувачем. Сеанс не може мати більше одного керівника терміналу, і один термінал не може бути керівником для декількох сеансів. В той же час можуть існувати сеанси, що взагалі не мають управляючого терміналу.

Кожна група процесів в системі одержує власний унікальний номер. Взнати цей номер можна за допомогою системного виклику getpgid(). Використовуючи його, процес може взнати номер групи для себе самого або для процесу з свого сеансу. На жаль, не у всіх версіях UNIX присутній даний системний виклик. Тут ми стикаємося з важкою спадщиною розділення ліній UNIX'ов на лінію BSD і лінію System V, яке буде нас переслідувати майже на всьому протязі даної теми. Замість виклику getpgid() в таких системах існує системний виклик getpgrp(), який повертає номер групи тільки для поточного процесу.

Системний виклик getpgid()

#include <sys/types.h>

#include <unistd.h>

pid_t getpgid(pid_t pid);

Опис системного виклику

Системний виклик повертає ідентифікатор групи процесів для процесу з ідентифікатором pid.

Взнати номер групи процес може тільки для себе самого або для процесу з свого сеансу. При інших значеннях pid системний виклик повертає значення -1.

Тип даних pid_t є синонімом для одного з цілочисельних типів мови З.

Системний виклик getpgrp()

#include <sys/types.h>

#include <unistd.h>

pid_t getpgrp(void);

Опис системного виклику

Системний виклик getpgrp повертає ідентифікатор групи процесів для поточного процесу.

Тип даних pid_t є синонімом для одного з цілочисельних типів мови С.

Для перекладу процесу в іншу групу процесів, можливо, з одночасним її створенням, застосовується системний виклик setpgid(). Перевести в іншу групу процес може або самого себе (і то не у всяку і не завжди), або свій процес-дитина, який не виконував системний виклик exec(), тобто не запускав на виконання іншу програму. При певних значеннях параметрів системного виклику створюється нова група процесів з ідентифікатором, співпадаючим з ідентифікатором процесу, що переводиться, полягаюча первинно тільки з одного цього процесу. Нова група може бути створена тільки у такий спосіб, тому ідентифікатори груп в системі унікальні. Перехід в іншу групу без створення нової групи можливий лише в межах одного сеансу.

В деяких різновидах UNIX системний виклик setpgid() відсутній, а замість нього використовується системний виклик setpgrp(), здатний тільки створювати нову групу процесів з ідентифікатором, співпадаючим з ідентифікатором поточного процесу, і переводити в неї поточний процес. (У ряді систем, де співіснують виклики setpgrp() і setpgid(), наприклад в Solaris, виклик setpgrp() поводиться інакше – він аналогічний виклику setsid(, що розглядається нижче).)

Системний виклик setpgid()

#include <sys/types.h>

#include <unistd.h>

int setpgid(pid_t pid, pid_t pgid);

Опис системного виклику

Системний виклик setpgid служить для перекладу процесу з однієї групи процесів в іншу, а також для створення нової групи процесів.

Параметр pid є ідентифікатором процесу, який потрібно перевести в іншу групу, а параметр pgid – ідентифікатором групи процесів, в яку належить перевести цей процес.

Не всі комбінації цих параметрів дозволені. Перевести в іншу групу процес може або самого себе (і то не у всяку, і не завжди), або свій процес-дитина, який не виконував системний виклик exec(), тобто не запускав на виконання іншу програму.

  • Якщо параметр pid рівний 0, то вважається, що процес переводить в іншу групу самого себе.

  • Якщо параметр pgid рівний 0, то в Linux вважається, що процес переводиться в групу з ідентифікатором, співпадаючим з ідентифікатором процесу, визначуваного першим параметром.

  • Якщо значення, визначувані параметрами pid і pgid, рівні, то створюється нова група з ідентифікатором, співпадаючим з ідентифікатором процесу, що переводиться, полягаюча первинно тільки з цього процесу. Перехід в іншу групу без створення нової групи можливий тільки в межах одного сеансу.

В нову групу не може перейти процес, що є лідером групи, тобто процес, ідентифікатор якого співпадає з ідентифікатором його групи.

Тип даних pid_t є синонімом для одного з цілочисельних типів мови С.

Значення, що повертається

Системний виклик повертає значення 0 при нормальному завершенні і значення -1 при виникненні помилки.

Системний виклик setpgrp()

#include <sys/types.h>

#include <unistd.h>

int setpgrp(void);

Опис системного виклику

Системний виклик setpgrp служить для перекладу поточного процесу в знов створювану групу процесів, ідентифікатор якої співпадатиме з ідентифікатором поточного процесу.

Значення, що повертається

Системний виклик повертає значення 0 при нормальному завершенні і значення -1 при виникненні помилки.

Процес, ідентифікатор якого співпадає з ідентифікатором його групи, називається лідером групи. Одне з обмежень на вживання викликів setpgid() і setpgrp() полягає в тому, що лідер групи не може перебратися в іншу групу.

Кожний сеанс в системі також має власний номер. Для того, щоб взнати його, можна скористатися системним викликом getsid(). В різних версіях UNIX на нього накладаються різні обмеження. В Linux такі обмеження відсутні.

Системний виклик getsid()

#include <sys/types.h>

#include <unistd.h>

pid_t getsid(pid_t pid);

Опис системного виклику

Системний виклик повертає ідентифікатор сеансу для процесу з ідентифікатором pid. Якщо параметр pid рівний 0, то повертається ідентифікатор сеансу для даного процесу

Тип даних pid_t є синонімом для одного з цілочисельних типів мови С.

Використовування системного виклику setsid() приводить до створення нової групи, що складається тільки з процесу, який його виконав (він стає лідером нової групи), і нового сеансу, ідентифікатор якого співпадає з ідентифікатором процесу, що зробив виклик. Такий процес називається лідером сеансу. Цей системний виклик може застосовувати тільки процес, що не є лідером групи.

Системний виклик setsid()

#include <sys/types.h>

#include <unistd.h>

int setsid(void);

Опис системних викликів

Цей системний виклик може застосовувати тільки процес, що не є лідером групи, тобто процес, ідентифікатор якого не співпадає з ідентифікатором його групи. Використовування системного виклику setsid приводить до створення нової групи, що складається тільки з процесу, який його виконав (він стає лідером нової групи), і нового сеансу, ідентифікатор якого співпадає з ідентифікатором процесу, що зробив виклик.

Значення, що повертається

Системний виклик повертає значення 0 при нормальному завершенні і значення -1 при виникненні помилки.

Якщо сеанс має управляючий термінал, то цей термінал обов'язково приписується до деякої групи процесів, що входить в сеанс. Така група процесів називається поточною групою процесів для даного сеансу. Всі процеси, що входять до поточної групи процесів, можуть скоювати операції уведення-виведення, використовуючи управляючий термінал. Вся решта груп процесів сеансу називається фоновими групами, а процеси, що входять в них – фоновими процесами. При спробі уведення-виведення фонового процесу через управляючий термінал цей процес одержить сигнали, які стандартно приводять до припинення роботи процесу. Передавати управляючий термінал від однієї групи процесів до іншої може тільки лідер сеансу. Помітимо, що для сеансів, що не мають управляючого терміналу, всі процеси є фоновими.

При завершенні роботи процесу – лідера сеансу всі процеси з поточної групи сеансу одержують сигнал SIGHUP, який при стандартній обробці приведе до їх завершення. Таким чином, після завершення лідера сеансу в нормальній ситуації роботу продовжать тільки фонові процеси.

Процеси, що входять до поточної групи сеансу, можуть одержувати сигнали, що ініціюються натисненням певних клавіш на терміналі – SIGINT при натисненні клавіш <ctrl> і <c>, і SIGQUIT при натисненні клавіш <ctrl> і <4>. Стандартна реакція на ці сигнали – завершення процесу (з утворенням core файлу для сигналу SIGQUIT).

Необхідно ввести ще одне поняття, пов'язане з процесом, – ефективний ідентифікатор користувача. В матеріалах першого семінару мовилося про те, що кожний користувач в системі має власний ідентифікатор – UID. Кожний процес, запущений користувачем, задіює цей UID для визначення своїх повноважень. Проте іноді, якщо у виконуваного файлу були виставлені відповідні атрибути, процес може видати себе за процес, запущений іншим користувачем. Ідентифікатор користувача, від імені якого процес користується повноваженнями, і є ефективним ідентифікатором користувача для процесу – EUID. За винятком вище обумовленого випадку, ефективний ідентифікатор користувача співпадає з ідентифікатором користувача, що створив процес.