LINUX.ORG.RU

Ищу pipe, к которому можно будет подключаться и отключаться по необходимости

 ,


0

1

Не знаю как правильно называется то что я ищу и есть ли вообще такое, надеюсь поможете. В любом случае буду признателен за идеи!

Обычный пайп (foo | bar) связывает две команды очень "жестко" - если одна команда завершается, то завершится и другая, плюс есть размер буфера и если кто-то не успевает вычитывать\записывать туда данные то другая команда тормозится, ну и плюс я не могу подцепиться к какому-нибудь пайпу и получить актуальные данные когда захочу. В целом немного тут помогает mkfifo, но как минимум тут проблема как раз в том что это FIFO - нужно выгрести все что туда понаписали чтоб получить свежие данные, и опять таки упираемся в размер буфера.

Мне нужно что-то типа UDP, только на уровне файлов-потоков - один процесс пишет туда данные и не париться читает ли там что-то этот выхлоп или нет, с какой скоростью и так далее. Читающий поток тоже просто подключается и получает те данные, которые сейчас проходят через эту трубу, и потом отключается когда захочет, и пишущий поток ничего об этом не знает. Соответственно сам такой "udp-пайп" существует независимо от того, кто в него пишет и читает, и есть ли вообще такие процессы - если писать некому, то читателю просто будет отдаваться "ничего", некому читать - просто выкидываем те данные, что пришли на вход.

Надеюсь что я примерно понятно выразил свою мысль. Сразу хочу сказать что решение, доступное для какой-то определенной софтины, мне не интересно - я хочу что-то "кросспрограммное". Ну и хотелось бы чтоб это было с какими-нибудь минимальными задержками.

Ответ на: комментарий от anonymous

Оно разве чем-то отличается от обычной ФС кроме того что лежит в раме? Тот же FIFO например никуда не денется.

micronekodesu ★★★
() автор топика

circular buffer в shared memory.

По идее, почти на всех платформах должно работать. Но на каждой платформе свою реализацию придётся делать. Впрочем, это настолько просто, что за полчаса можно для всех основных платформ написать.

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

Впрочем, это настолько просто, что за полчаса можно для всех основных платформ написать.

Особенно для того кто на c\c++ ничего не писал =)

Спасибо, это вроде то что мне нужно, пошел искать туториалы!

micronekodesu ★★★
() автор топика

судя по описанию, тебе нужны POSIX message queue.

То же самое что именованные пайпы, но

  • данные пишутся и читаются чанками фиксированного размера (размер чанка конфигурируется).
  • непрочитанные чанки сохраняются в очереди даже после закрытия пишущего процесса (но до перезагрузки). Максимальное число чанков также конфигурируется.
  • нет проблем завести несколько читающих процессов.
  • чанкам можно выставлять приоритет.

В общем,

man 7 mq_overview
Lrrr ★★★★★
()
Ответ на: комментарий от Lrrr

Мне как раз не нужно как-то хранить данные или управлять их количеством, но может тоже подойдет, посмотрю. Спасибо!!

micronekodesu ★★★
() автор топика
Ответ на: комментарий от Atlant

Я так понимаю речь про 224.0.0.1. Я пробовал, но у меня читается только какой-то один кусок данных, и пока не переподключусь клиентом новых данных не получаю - например, если данные пишет ping, то получаю инфу только про один реплай, и потом сколько не жду - тишина, стоит остановить клиент и запустить заново - приходит информация про еще один пакет (и по номеру видно что пинг работает в это время) и опять тишина.

micronekodesu ★★★
() автор топика

Вам может помочь ZeroMQ

Мне нужно что-то типа UDP, только на уровне файлов-потоков - один процесс пишет туда данные и не париться читает ли там что-то этот выхлоп или нет, с какой скоростью и так далее. Читающий поток тоже просто подключается и получает те данные, которые сейчас проходят через эту трубу, и потом отключается когда захочет, и пишущий поток ничего об этом не знает.

…в частности, его режим Publish-Subscribe. Один процесс может работать в режиме publisher, а читающий поток может по мере надобности делать subscribe. Или не делать.

anonymous
()
Ответ на: комментарий от micronekodesu

Особенно для того кто на c\c++ ничего не писал =)

Ну не обязательно на сишечке, почти у всех языков есть какой-нибудь интерфейс к сисколлам, через который это можно сделать.

Stanson ★★★★★
()
Ответ на: комментарий от anonymous

Это не плохо работает если у меня есть код, в который я могу добавить работы с очередями, и вообще когда я обмениваюсь текстовыми сообщениями. Если мне придется передавать стопицот гигов бинарных данных мне очереди будут только мешать. Но спасибо за совет!

micronekodesu ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.