Первый символ в строке режима ( p
) указывает на то, что файл имеет тип FIFO (именованный канал). Теперь в одном терминальном окне можно осуществлять чтение из файла с помощью команды
% cat < /tmp/fifo
а в другом окне можно выполнять запись в файл:
% cat > /tmp/fifo
Попробуйте во втором окне ввести какой-то текст и нажать . Введенный текст немедленно отобразится в первом окне. Канал закрывается нажатием клавиш во втором окне. FIFO-файл удаляется с помощью следующей команды:
% rm /tmp/fifo
Создание FIFO-файла
FIFO-файл можно создать программным путем с помощью функции mkfifo()
. Первым аргументом является путь к файлу. Второй аргумент задает права доступа к каналу со стороны его владельца, группы и остальных пользователей (об этом пойдет речь в разделе 10.3, "Права доступа к файлам"). Поскольку у канала есть читающая и записывающая стороны, права доступа должны учитывать оба случая. Если канал не может быть создан (например, файл с таким именем уже существует), функция mkfifo()
возвращает -1. Для работы функции требуется подключить к программе файлы и .
Доступ к FIFO-файлу
К FIFO-файлу можно обращаться как к обычному файлу. При организации межзадачного взаимодействия одна программа должна открыть файл для записи, а другая - для чтения. Над файлом можно выполнять как низкоуровневые ( open()
, write()
, read()
, close()
и др.), так и высокоуровневые ( fopen()
, fprintf()
, fscanf()
, fclose()
и др.) функции.
Например, на низком уровне запись блока данных в FIFO-файл осуществляется следующим образом:
int fd = open(fifo_path, O_WRONLY);
write(fd, data, data_length);
close(fd);
А так выполняется чтение строки из FIFO-файла на высоком уровне:
FILE* fifo = fopen(fifo_path, "r");
fscanf(fifo, "%s", buffer);
fclose(fifo);
У FIFO-файла одновременно может быть несколько читающих и записывающих программ. Входные потоки разбиваются на атомарные блоки, размер которых определяется константой PIPE_BUF
(4 Кбайт в Linux). Если несколько программ параллельно друг другу осуществляют запись в файл, их блоки будут чередоваться. То же самое относится к программам. одновременно читающим данные из файла.
Отличия от именованных каналов в Windows
Каналы операционных систем семейства Win32 очень напоминают каналы Linux. Основное различие касается именованных каналов, которые в Win32 функционируют скорее как сокеты. Именованные каналы Win32 способны соединять по сети процессы, выполняющиеся на разных компьютерах. В Linux для этой цели используются именно сокеты. Кроме того, в Win32 допускается, чтобы несколько программ чтения или записи работали с именованным каналом, не перекрывая потоки друг друга, а сами каналы поддерживают двунаправленный обмен данными. [17] Именованный канал можно создать только в Windows NT. В Windows 9х программы могут устанавливать только клиентские соединения.
Сокет — это устройство двунаправленного взаимодействия, которое предназначено для связи с другим процессом, выполняющимся на этом же или на другом компьютере. Сокеты используются Internet-программами, такими как telnet
, rlogin
, ftp
, talk
и Web-броузеры.
Например, с помощью программы telnet
можно получить от Web-сервера HTML-страницу, поскольку обе программы общаются по сети при помощи сокетов. Чтобы установить соединение с Web-сервером www.codesourcery.com
, следует ввести команду telnet www.codesourcery.com 80
. Загадочная константа 80 обозначает порт, который прослушивается Web-сервером. Когда соединение будет установлено, введите команду GET /
. В результате через сокет будет послан запрос Web-серверу, который в ответ вернет начальную HTML-страницу, после чего закроет соединение.
% telnet www.codesourcery.com 80
Trying 206.168.99.1...
Connected to merlin.codesourcery.com (206.168.99.1).
Escape character is '^]'.
GET /
...
При создании сокета необходимо задать три параметра, тип взаимодействия, пространство имен и протокол.
Тип взаимодействия определяет способ интерпретации передаваемых данных и число абонентов. Данные, посылаемые через сокет, формируются в блоки, называемые пакетами. Тип взаимодействия указывает на то, как обрабатываются пакеты и как они передаются от отправителя к получателю.
■ При взаимодействии с установлением соединения гарантируется доставка пакетов в том порядке, в каком они были отправлены. Если пакеты теряются или приходят в неправильном порядке из-за проблемы в сети, принимающая сторона автоматически запрашивает у отправителя повторную отправку данных.
Читать дальше