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
   65   66   67   68   69   70   71   72   73   74   75