Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.
А это две из восьми подборок моего канала канала о программировании на языке Python
Именованные каналы и взаимодействие процессов
FIFO - first in, first out, т.е. первый пришёл, первый ушёл. Известная программная структура под названием очередь, где как раз и реализован этот принцип. В unix-подобных операционных системах реализован механизм именованных каналов, в которых реализован этот принцип. Реализован он с помощью специальных fifo-файлов. С помощью таких файлов могут взаимодействовать совершенно разные процессы (два и более), не связанные отношением "предок-потомок". Для этого они должны просто знать имя файла. Особенностью fifo-канала является то, что он односторонний (полудуплекс), поэтому для полноценного обмена данными обычно создаётся два fifo-файла. Кроме того, размер fifo-файла (канала) ограничен системными настройками. Кроме того, файл автоматически очищается после того, как все процессы закрывают ссылки на него.
Создадим две программы которые будут взаимодействовать через fifo-каналы. Одну программу назовём сервером. Она выполняет следующие действия:
- Проверяет, есть ли файлы с данным именем в каталоге '/tmp' (обычное место). Есть ли файлы уже существуют, то мы их удаляем. Файлы fifo удаляются обычным способом, как и другие файлы.
- С помощью метода mkfifo() создадим два именованных канала. Один канал будет использован для приёма сообщений, другой для передачи сообщения.
- После каналы открываются как обычные файлы.
- Далее программа ждёт получения сообщения. Сообщение выводится на консоль и пересылается клиентской программе. Если в сообщение содержится слово 'end', то сервер заканчивает свою работу.
- Важно отметить, что данные пересылаются в виде байтовых строк, поэтому приходится производить прямое и обратное декодирование.
Программа представлена ниже.
Вторая программа, назовём её клиентской, представлена ниже. Она выполняет следующие действия:
- Открывает fifo-файлы, которые ранее были созданы программой-севером. При чём заметим, что если для сервера один файл является входным (to), то для клиенты он будет выходным (from). Такой же расклад для второго файла. Для сервера он выходной (from), для клиента входной (to).
- Далее клиент ожидает сообщения с клавиатуры, которое он передаёт серверу. Предварительно он перекодирует его в байтовую строку. И далее ждёт подтверждения о приёме от сервера, которое выводит на консоль.
- Команда 'end' заканчивает работу и сервера и клиента.
Замечание
1. Для проверки работы программ они запускаются в разных консолях.
2. Первым запускается сервер, который и создаёт именованные каналы.
3. В качестве клиентов можно использовать несколько программ, представленных выше. Только нужно помнить, что при чтении канал очищается.
Хорошего программирования. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.