1 Функція pipe(2) створює односпрямований канал (симплексний) для анонімного обміну даними поміж двома спорідненими процесами, позаяк лише вони можуть отримати доступ до одного й того самого каналу. Після завершення роботи канал знищується. Функція має вигляд
#include <unistd.h>
int pipe(int filedes[2])
Функція повертає два файлових дескриптори fd у масиві fd[0] та fd[1]; filedes[0] дозволяє читання даних з каналу, а filedes[1] використовується для записування даних у канал.
2 Функція fcntl(2) забезпечує керування файловими операціями у вже відкритих файлах, заданих дескрипторами файла — filedes.
#include < fcntl.h> — заголовний файл, у якому визначено цілі константи: O_RDONLY (для решти лише читати), O_WRONLY (для решти лише писати), O_RDWR (для решти читати та писати), які встановлюють або знімають блокування на файли чи їхні частки.
int fcntl (int filedes, int cmd, …) — функція fcntl(2) виконує дію, зазначену в cmd, з файлом, а третій аргумент залежить від конкретної дії:
а) F_SETLK — встановити блокування запису файла; структура flock описує блокування, а покажчик на неї передається у третьому аргументі; за неможливості блокування fcntl(2) повертається з помилкою EACCESS або EAGAIN.
б) F_SETLKW — аналогічний до попереднього, але аргумент використовується за неможливості блокування, якщо запис вже заблоковано; процес переходить до стану сну, очікуючи на зняття блокування (W_WAIT, очікувати).
в) F_SETFL — визначає режим запису даних наприкінці файла.
3 Функція printf(2) — запис до форматизованого стандартного виводу.
4 Системний виклик unlink(2) вилучає файл, наприклад unlink(“/tmp/usedfile”); виклик повертає 0 у разі успішного завершення та -1 — у разі помилки.
5 Системний виклик read(2) копіює довільну кількість символів чи байтів з файла до буфера (в ASCII кодах).
6 Системний виклик open(2) відкриває файл для читання, запису або створює порожній файл.
7 Системний виклик close(2) закриває файл, повертає його в разі успішного завершення та -1 — у разі помилки:
#include <unistd.h>
int close (int filedes)
filedes = open(“file”, O_RDONLY);
∙
∙
∙
close (filedes);
8 Системний виклик write(2) — копіює дані з буфера програми, що трактується як масив, до зовнішнього файла. Він, як і read(2), має три аргументи: дескриптор файла filedes, покажчик на записувані дані buffer та n — додатне число, котре визначає кількість записуваних байтів.
#include <unistd.h>
ssize_t write(int filedes, const void *buffer, size_t n).
У додатку А наведено тексти програм “Сервера” та “Клієнта”, які зреалізовують взаємодію процесів за допомогою іменованих каналів FIFO. Клієнт за традицією надсилає серверові повідомлення “Dobryj denj, Svite!”, а сервер виводить це повідомлення на термінал. Програми написано мовою С.
Контрольні запитання
1 З якою метою взаємодіють поміж собою процеси?
2 За допомогою яких засобів взаємодіють поміж собою процеси у всіх версіях UNIX?
3 Взаємодію поміж якими процесами можуть забезпечити канали?
4 Які атрибути має системний виклик mkfifo(2)?
5 За якими правилами працюють канали та іменовані канали?
6 Чим відрізняється FIFO від звичайного каналу?
7 Яку функцію виконує системний виклик unlink(2)?
8 Що зреалізовує функція fcntl(2)?