mailslots в Linux

Добрый день!

Есть ли в Linux механизм, схожий с механизмом mailslots в Windows?
Если нет, то как обстоят дела с этим? Планируется ли создание в ядре Linux механизма на подобии механизма mailslots? И чем можно заменить подобный механизм, кроме как групповой или широковещательной рассылки TCP/IP?

Добрый день. Что такое

Добрый день. Что такое «механизм mailslots»?

Текстовый редактор vi имеет два режима работы: в первом он пищит, а во втором — всё портит.

http://en.wikipedia.org/wiki/

http://en.wikipedia.org/wiki/MailSlot

Сокеты же!

Не грусти, товарищ! Всё хорошо, beautiful good!

=3=

krigstask так хорошо начал, а winterheart всё испортил.

а эта строка - это просто подпись

Что такое mailslots

Нет, mailslots это не совсем сокеты. Точнее, это даже совсем не сокеты. Это отдельный механизм IPС в Windows. В википедии очень мало написано и очень сжато, поэтому вы сделали ложный вывод что это сокеты.
Это совсем не так!

Придётся объяснять. Сначала что такое mailslots ("Системное программирование в среде Windows", Джонсон М.Харт):

Цитата:
Как и именованные каналы, почтовые ящики (mailslots) Windows снабжаются именами, которые могут быть использованы для обеспечения взаимодействия между независимыми каналами. Почтовые ящики представляют собой широковещательный механизм, основанный на дейтаграммах, и ведут себя иначе по сравнению с именованными каналами, что делает их весьма полезными в ряде ограниченных ситуаций, которые, тем не менее, представляют большой интерес. Из наиболее важных свойств почтовых ящиков можно отметить следующие:

  • Почтовые ящики являются однонаправленными.
  • С одним почтовым ящиком могут быть связаны несколько записывающих программ (writers) и несколько считывающих программ (readers), но они часто связаны между собой отношениями "один ко многим" в той или иной форме.
  • Записывающей программе (клиенту) не известно достоверно, все ли, только некоторые или какая-то одна из программ считывания (сервер) получили сообщение.
  • Почтовые ящики могут находиться в любом месте сети.
  • Размер сообщений ограничен.

В этой же литературе написано:

Цитата:
Средства, сопоставимые с почтовыми ящиками, в UNIX отсутствуют. Однако для этой цели могут быть использованы широковещательные (broadcast) или групповые (multicast) дейтаграммы протокола TCP/IP.

В Linux (на счёт всех POSIX-совместимых или частично POSIX-совместимых систем говорить не буду, потому что достоверно не знаю) существует множество способов организации обмена данными между процессами. Это:

  • обычные файлы;
  • неименованные каналы;
  • именованные каналы;
  • парные сокеты;
  • файловые сокеты;
  • сетевые сокеты;
  • разделяемая память;
  • очереди сообщений;
  • также можно отнести сюда сигналы (правда, это не совсем обмен данными, но тем не менее связь).

Возможно, есть ещё какие-то способы, о которых я, пока, не знаю.

В ОС Windows ко всему этому добавляется ещё и mailslots как отдельная технология, которая, тем не менее, использует стандартные функции чтения-записи: ReadFile, WriteFile.
Более подробно про mailslots можно прочитать в MSDN.

Так же вот что удалось найти в Интернете по этой теме в Windows:

Есть так же одна статья в которой говорится так:

Цитата:
Mailbox(Unix)/Mailslot(Windows) – механизм почтовых ящиков. Нужен, если есть редко используемый сервис. Ему можно кидать данные в ящик, а он будет время от времени его проверять. Почтовых ящиков может быть много.

Это, пожалуй, единственная статья где технология mailslots от MS пишется рядом с UNIX. Тут или ошибка, или технология mailslot в UNIX действительно существует.

Насколько я понимаю, mailslots это не придумка MS, это один из базовых механизмов передачи данных между процессами. Но точно утверждать не берусь, Дейкстар ли это придумал, либо кто-то из других учёных, либо всё же это собственная разработка MS.

Есть одна интересная статья на sourceforge: http://mailslots.sourceforge.net/mailslots.htm
Вот она то и вызывает смущение. Бегло пробежавшись по ней, я понял что люди предлагают ещё один механизм IPC для обмена данными между процессами в Linux, а именно mailslots.
Но в конце есть фраза:

Цитата:
3.0 Implementation:

(working on it)

Статья, судя по всему, писалась очень давно. Мне интересно, а какое положение дел в настоящий момент? Что-то ведётся в этом направлении?

Это был мой первый вопрос.

Теперь переформулирую свою задачу.
У меня есть в процессе отдельный специальный поток (thread), который периодически пишет данные в сокетпары. Есть множество других потоков (thread) или отфорканых процессов, которые читают данные из этих сокетпар.
Мне необходимо простым образом организовать групповую рассылку, чтобы я мог писать не в каждую сокетпару, используя список дескрипторов, а только в один какой-то канал. А другие могли читать этот канал.
В Windows подобную схему можно легко организовать с помощью mailslots. В unix-like ОС такое можно организовать, например, рассылкой мультикастовых сообщений и слушать в процессах пришедший мультикаст. Но это как-то неудобно. Может кто-то может предложить иной способ или что-то внятное посоветовать? Как лучше сделать такое?

как сделать ? - написать

как сделать ? - написать самому
skip...
на основе чего ? на основе очень стандартного для никсов механизма RPC - здесь кратко и на русском

Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)

slepnoga написал(а): как

slepnoga написал(а):
как сделать ? - написать самому

Ну понятно дело. Я сам и пишу, только не mailslots, а свой механизм. Но было бы гораздо приятнее использовать готовый механизм ядра, наподобие mailslots.
Писать mailslots пока не хватает ни опыта ни времени (добавлять базовый IPC в ядро я имею ввиду). Мне проще на уровне приложения организовать такой обмен данными.

slepnoga написал(а):
на основе чего ? на основе очень стандартного для никсов механизма RPC - здесь кратко и на русском

Статья очень интересная, только немного не то. Наверное, я опять не так выразился. Мне нужно не RPC и не обмен данными между разными операционными системами. У меня всё работает на одной железке под управлением одной ОС. Все задачи являются дочерними процессами от одного процесса или его потоками (fork, pthread). И мне нужно чтобы был один писатель и несколько читателей. Сейчас работает так:
я организовываю список и в этом списке есть в том числе и парные сокеты, через которые происходит обмен. Если мне необходимо передать строку "ПРИВЕТ" всем получателям, то я в цикле прохожу весь список и в каждую сокетпару кидаю это сообщение. Но это очень медленно и не совсем красиво. Использовать мультикаст, по-моему, тоже не лучший вариант. Вот, примерно, так. Есть какие-нить идеи?

А на счёт mailslots, я так понял, в UNIX такого механизма нет?

такого нет. Ибо не нужен как

такого нет. Ибо не нужен как я понимаю. Все юзают shm, давно и прочно - там и как бы проще , если все в пределах жизни одного процесса. В винде то маилслоты сетевые, тебе как я понял это не надо

Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".