Сигнали можуть повідомляти про помилки, для синхронізації процесів, для передачі найпростіших команд від одного процесу до іншого, наприклад, для сервераDNSnamed (1M) таким чином використовується сігналSIGHUP, що є сигналом поновлення бази данних.Сігнали дуже ресурсомісткі. Відправлення сигналу вимагає системного виклику, а доставка - переривання процесу-одержувача і операцій зі стеком (робота з підпрограмою). Сигнали малоінформативними і їх кількість обмежена.
Канали. На прикладі команди в командному строкеshellрассмотрім синтаксис організації програмних каналів:
Стандартний висновок команди cat (1), яка виводить вміст файлаmyfile, передається на стандартне введення программиwc (1), яка підраховує кількість рядків, слів та символів. В результаті виходить:
кількість рядків, слів, символів в myfile
Таким чином, два процеси обмінялися даними. При цьому використовувався програмний канал, що забезпечує односпрямовану передачу даних між двома завданнями.
Для створення каналу використовується системний виклик pipe (2):
int pipe (int * fildes), інакше int pipe (int filedes [2]);
який повертає два файлових дискриптор - fildes [0] для запису в канал і fildes [1] для читання з каналу (якщо невдача, виклик pipe поверне - 1). Тепер один процес записує дані в fildes [0], інший може отримати ці дані ізfildes [1]. Як отримує файловий дескріпторfildes [1] інший процес? При створенні процесу успадковують атрибути дочірній процес успадковує і розділяє всі призначені файлові дескриптори процесу батьківського. Доступ до дескріпторамfiledesканала може отримати сам процес, визвавшійpipe (2), і його дочірні процеси. Серйозний недолік каналів в тому, що вони можуть бути використані для передачі даних тільки між спорідненими процесами і не можуть бути використані для передачі даних між незалежними процесами. У наведеному прикладі обидва процессаcat (1) іwc (1) создаютсяshellі тому є спорідненими.
Недоліком каналів є те, що вони можуть використовуватися тільки для споріднених процесів і не можуть бути використані для справжніх серверних програм (сервери управління мережею і спулер) і не можуть існувати постійно.
Назва каналів FIFO (FirstInFirstOut, 1-м-увійшов, 1-м-вийшов). FIFO є односпрямованим засобами передачі даних, причому читання даних відбувається в порядку їх запису. FIFO мають імена, які дозволяють взаємодіяти незалежним процесам (іменовані канали) .ВBSDне іспользуются.FIFOявляется типом файлів (ls-lпокажет в першій позіцііp). Для созданіяFIFOіспользуется системний визовmknod (2):
де pathname- ім'я файлу в Ф.С. (імяFIFO),
mod- прапори володіння прав доступу і тд. (полеmode) .Наприклад, 0666 -для всіх права доступу на запис і читання.
dev- при створенні файлу ігнорується.
FIFOможет бути створений і з командного строкіshell:
Після створення FIFOможет бути відкритий на запис і читання, причому запис і читання можуть відбуватися в різних незалежних процесах.
Канали FIFOі звичайні канали працюють за такими правилами:
При читанні меншого числа байтів, ніж знаходяться в каналі або FIFO, повертається необхідне число байтів, залишок зберігається для наступних читань.
Якщо канал порожній і жоден процес не відкрив його на запис, при читанні з каналу буде отримано 0 байтів. Якщо канал відкривали для запису, але не записали, то виклик read (2) буде заблокований до появи даних, якщо в каналі не встановлено прапор відсутності блокування O_NDELAY.
Запис числа байтів, меншого ємності каналу або FIFO, гарантовано атомарному. Це означає, що в разі запису в канал одночасно декількома процесами, порції даних не перемішуються.
При записи більшого числа байтів, ніж це дозволяє канал або FIFO, виклик write (2) блокується до звільнення місця. Атомарність при цьому не гарантується. Якщо процес намагається записати дані в канал, що не відкритий жодним процесом на читання, процесу гарантується сигнал SIGPIPE, а виклик write (2) повертає 0 з установкою помилки (errno = EPIPE), якщо процес не встановив обробки сигналу SIGPIPE, проводиться обробка за замовчуванням - процес завершується.