Page 70 - 2578
P. 70
FIFO може бути створено і з командою рядка shell:
$ mkfifo name p
Після створення FIFO може бути відкрито на записування
та читання, причому записування та читання можуть
відбуватися в різних незалежних процесах. Канали FIFO та
звичайні канали працюють за такими правилами:
1 При читанні меншої кількості байтів, аніж перебуває в
каналі або FIFO, повертається потрібна кількість байтів, а
решта зберігається для подальших читань.
2 При читанні більшої кількості байтів, аніж перебуває в
каналі чи FIFO, повертається доступна кількість байтів.
Процес, що він читає з каналу, має опрацьовувати ситуацію,
коли прочитано менше, аніж замовлено.
3 Якщо канал є порожній і жоден процес не відкрив його
на записування, системний виклик read(2) буде заблоковано
до з’явлення даних (якщо лише для каналу або FIFO не
встановлено прапорець відсутності блокування O_NDELAY).
4 Запис кількості байтів меншої ємності каналу або FIFO
гарантовано атомарно. Це означає, що в разі, коли кілька
процесів водночас записують дані до каналу, порції даних від
цих процесів не перемішуються.
5 У перебігу запису більшої кількості байтів, аніж це
дозволяє канал або FIFO, виклик write(2) блокується до
звільнення потрібного місця, але атомарність цієї операції не
гарантується. Якщо процес намагається записати дані до
каналу, не відкриваного жодним процесом, процесові
генерується сигнал SIGPIPE, а виклик write(2) повертає 0 із
встановленням помилки (errno = EPIPE). Якщо процес не
встановив опрацьовування сигналу SIGPIPE, опрацьовування
відбувається за умовчанням — процес завершується.
У каналі може перебувати лише певна кількість байтів,
перш ніж наступний виклик write(2) буде заблоковано.
Мінімальний розмір каналу, визначений POSIX, дорівнює 512
69