![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Програмні канали не мають імен, і їх головним недоліком є неможливість передачі інформації між несумісними процесами. Два неспоріднених процеси не можуть створити канал для зв'язку між собою (якщо не передавати дескриптор).
Абревіатура FIFO розшифровується як «first in, first out» - «першим прийшов, першим пішов», тобто ці канали працюють як черги. Іменовані канали в Unix функціонують подібно неіменованого - вони дозволяють передавати дані тільки в одну сторону. Однак на відміну від програмних каналів кожному каналу FIFO зіставляється повне ім'я у файловій системі, що дозволяє двом неспорідненим процесам звернутися до одного і того ж FIFO.
FIFO створюється функцією mkfifо:
int mkfifo (const char * раthnаme, mode_t mоdе);
/ * Повертає 0 при успішному виконанні, -1 - при виникненні помилок * /
Тут pathname - звичайне для Unix повне ім'я файлу, яке і буде ім'ям FIFO.
Аргумент mode вказує бітову маску дозволів доступу до файлу, аналогічно другому аргументу команди open.
Функція mkfifo діє як open, викликана з аргументом O_CREAT | O_EXCL. Це означає, що створюється новий канал FIFO або повертається помилка EEXIST, у разі якщо канал із заданим повним ім'ям вже існує. Якщо не треба створювати новий канал, потрібно викликати open замість mkfifo. Для відкриття існуючого каналу або створення нового, в тому випадку, якщо його ще не існує, потрібно викликати mkfifo, перевірити, чи не повернута помилка EEXIST, і якщо таке трапиться, викликати функцію open.
Команда mkfifо також створює канал FIFO. Нею можна користуватися в сценаріях інтерпретатора або з командного рядка.
Після створення канал FIFO повинен бути відкритий на читання або запис за допомогою функції open, або однієї зі стандартних функцій відкриття файлів з бібліотеки вводу-виводу (наприклад, fopen). FIFO може бути відкритий або тільки на читання, або тільки на запис. Не можна відкривати канал на читання і запис, оскільки іменовані канали можуть бути тільки односторонніми.
При записі в програмний канал або канал FIFO викликом write дані завжди додаються до вже наявних, а виклик read зчитує дані, поміщені в програмний канал або FIFO першими. При виклику функції lseek для програмного каналу або FIFO буде повернута помилка ESPIPE.
Дата публикования: 2015-10-09; Прочитано: 329 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!