Простір імен. Адресація в System V IPC. Функція ftok() 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Простір імен. Адресація в System V IPC. Функція ftok()



Всі засоби зв'язку з System V IPC, як і вже розглянуті нами pipe і FIFO, є засобами зв'язку з непрямою адресацією. Як ми встановили раніше, для організації взаємодії неспоріднених процесів за допомогою засобу зв'язку з непрямою адресацією необхідно, щоб цей засіб зв'язку мав ім'я. Відсутність імен у pip'ів дозволяє процесам одержувати інформацію про розташування pip'а в системі і його стан тільки через споріднені зв'язки. Наявність асоційованого імені у FIFO – імені спеціалізованого файлу у файловій системі – дозволяє неспорідненим процесам одержувати цю інформацію через інтерфейс файлової системи.

Безліч всіх можливих імен для об'єктів якого-небудь вигляду прийнято називати простором імен відповідного виду об'єктів. Для FIFO простором імен є безліч всіх допустимих імен файлів у файловій системі. Для всіх об'єктів з System V IPC таким простором імен є безліч значень деякого цілочисельного типу даних – key_t – ключа. Причому програмісту не дозволено напряму привласнювати значення ключа, це значення задається опосередковано: через комбінацію імені якого-небудь файлу, вже існуючого у файловій системі, і невеликого цілого числа – наприклад, номеру екземпляра засобу зв'язку.

Такий спосіб отримання значення ключа пов'язаний з двома міркуваннями:

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

· Другий компонент значення ключа використовується для того, щоб дозволити програмісту пов'язати з одним і тим же ім'ям файлу більше одного екземпляра кожного засобу зв'язку. Як такий компонент можна задавати порядковий номер відповідного екземпляра.

Отримання значення ключа з двох компонентів здійснюється функцією ftok().

Функція для генерації ключа System V IPC

#include <sys/types.h>#include <sys/ipc.h>key_t ftok(char *pathname, char proj);

Опис функції

Функція ftok служить для перетворення імені існуючого файлу і невеликого цілого числа, наприклад, порядкового номера екземпляра засобів зв'язку, в ключ System V IPC.

Параметр pathname повинен бути покажчиком на ім'я існуючого файлу, доступного для процесу, що викликає функцію.

Параметр proj – це невелике ціле число, що характеризує екземпляр засобу зв'язку.

У разі неможливості генерації ключа функція повертає негативне значення, інакше вона повертає значення ключа, що згенерувався. Тип даних key_t звичайно є 32-бітовим цілим.

Ще раз підкреслимо три важливі моменти, зв'язані з використанням імені файлу для отримання ключа. По-перше, необхідно указувати ім'я файлу, який вже існує у файловій системі і для якого процес має право доступу на читання (не плутайте із завданням імені файлу при створенні FIFO, де указувалося ім'я для знов створюваного спеціального файлу). По-друге, вказаний файл повинен зберігати своє положення на диску до тих пір, поки всі процеси, що беруть участь у взаємодії, не одержать ключ System V IPC. По-третє, завдання імені файлу, як одного з компонентів для отримання ключа, у жодному випадку не означає, що інформація, передавана за допомогою асоційованого засобу зв'язку, розташовуватиметься в цьому файлі. Інформація зберігатиметься усередині адресного простору операційної системи, а задане ім'я файлу лише дозволяє різним процесам згенерувати ідентичні ключі.

Дескриптори System V IPC

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

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

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



Поделиться:


Последнее изменение этой страницы: 2016-12-12; просмотров: 161; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.118.31.247 (0.006 с.)