Способы общения между дочерними процессами через дескриптор

Способы общения между дочерними процессами через дескриптор

13.06.2014 06:45:19 Просмотров 24 Источник

Между родительским и дочерним все как то проще (там дочерний наследует открытые файловые дескрипторы), но между дочерними сложнее, дочерний не может открыть дескриптор другого дочернего

Будьте добры, подскажите, но способ должен быть связан с работой через дескриптор Может можно как то использовать дескрипторы другого процесса?

P.S.: количество дочерних процессов, в течении работы программы, постоянно меняется (пишу сервер, и для каждого подключившегося клиента создаю дочерний процесс).

У вопроса есть решение - Посмотреть?

https://ru.stackoverflow.com/questions/328132/%d0%a1%d0%bf%d0%be%d1%81%d0%be%d0%b1%d1%8b-%d0%be%d0%b1%d1%89%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d0%b4%d0%be%d1%87%d0%b5%d1%80%d0%bd%d0%b8%d0%bc%d0%b8-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%b0%d0%bc%d0%b8-%d1%87%d0%b5%d1%80%d0%b5%d0%b7-%d0%b4%d0%b5%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%be%d1%80#comment328136_328132
А нельзя ли создать доп. пару дескрипторов, запустить дочерние процессы, закрыть в родительском, и пусть через эту пару и общаются?
https://ru.stackoverflow.com/questions/328132/%d0%a1%d0%bf%d0%be%d1%81%d0%be%d0%b1%d1%8b-%d0%be%d0%b1%d1%89%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d0%b4%d0%be%d1%87%d0%b5%d1%80%d0%bd%d0%b8%d0%bc%d0%b8-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%b0%d0%bc%d0%b8-%d1%87%d0%b5%d1%80%d0%b5%d0%b7-%d0%b4%d0%b5%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%be%d1%80#comment328138_328132
забыл сказать: количество дочерних процессов, в течении работы программы, непостоянное количество. Поэтому здесь такое не прокатит
https://ru.stackoverflow.com/questions/328132/%d0%a1%d0%bf%d0%be%d1%81%d0%be%d0%b1%d1%8b-%d0%be%d0%b1%d1%89%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d0%b4%d0%be%d1%87%d0%b5%d1%80%d0%bd%d0%b8%d0%bc%d0%b8-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%b0%d0%bc%d0%b8-%d1%87%d0%b5%d1%80%d0%b5%d0%b7-%d0%b4%d0%b5%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%be%d1%80#comment328139_328132
через pipe родитель раздаёт детям и настривает а затем закрывает свои , что бы не мешать
https://ru.stackoverflow.com/questions/328132/%d0%a1%d0%bf%d0%be%d1%81%d0%be%d0%b1%d1%8b-%d0%be%d0%b1%d1%89%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d0%b4%d0%be%d1%87%d0%b5%d1%80%d0%bd%d0%b8%d0%bc%d0%b8-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%b0%d0%bc%d0%b8-%d1%87%d0%b5%d1%80%d0%b5%d0%b7-%d0%b4%d0%b5%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%be%d1%80#comment328140_328132
количество дочерних процессов постоянно меняется, тут так не получится: не все дочерние смогут друг с другом связаться
https://ru.stackoverflow.com/questions/328132/%d0%a1%d0%bf%d0%be%d1%81%d0%be%d0%b1%d1%8b-%d0%be%d0%b1%d1%89%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d0%b4%d0%be%d1%87%d0%b5%d1%80%d0%bd%d0%b8%d0%bc%d0%b8-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%b0%d0%bc%d0%b8-%d1%87%d0%b5%d1%80%d0%b5%d0%b7-%d0%b4%d0%b5%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%be%d1%80#comment328141_328132
@knoxx: Тогда вам сюда
https://ru.stackoverflow.com/questions/328132/%d0%a1%d0%bf%d0%be%d1%81%d0%be%d0%b1%d1%8b-%d0%be%d0%b1%d1%89%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d0%b4%d0%be%d1%87%d0%b5%d1%80%d0%bd%d0%b8%d0%bc%d0%b8-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%b0%d0%bc%d0%b8-%d1%87%d0%b5%d1%80%d0%b5%d0%b7-%d0%b4%d0%b5%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%be%d1%80#comment328159_328132
тогда в родителе можно завести монитор и через него менеджит "каналами" т.е у каждого потомка есть пара к монитору на чтение/запись через который идёт запрос на получение и либо публикация своих контактов монитор в свою очередь выполняет роль сводни :) корочи кури литературу на тему csp
https://ru.stackoverflow.com/questions/328132/%d0%a1%d0%bf%d0%be%d1%81%d0%be%d0%b1%d1%8b-%d0%be%d0%b1%d1%89%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d0%b4%d0%be%d1%87%d0%b5%d1%80%d0%bd%d0%b8%d0%bc%d0%b8-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%b0%d0%bc%d0%b8-%d1%87%d0%b5%d1%80%d0%b5%d0%b7-%d0%b4%d0%b5%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%be%d1%80#comment328172_328132
спасибо, я так понял, что мой выбор - FIFO
https://ru.stackoverflow.com/questions/328132/%d0%a1%d0%bf%d0%be%d1%81%d0%be%d0%b1%d1%8b-%d0%be%d0%b1%d1%89%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d0%b4%d0%be%d1%87%d0%b5%d1%80%d0%bd%d0%b8%d0%bc%d0%b8-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%b0%d0%bc%d0%b8-%d1%87%d0%b5%d1%80%d0%b5%d0%b7-%d0%b4%d0%b5%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%be%d1%80#comment328177_328132
Я, например, люблю работать с socketpair() анонимных неблокирующих unix-сокетов. При любой схеме создания потомков, независимо от их количества и времён появления.
https://ru.stackoverflow.com/questions/328132/%d0%a1%d0%bf%d0%be%d1%81%d0%be%d0%b1%d1%8b-%d0%be%d0%b1%d1%89%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d0%b4%d0%be%d1%87%d0%b5%d1%80%d0%bd%d0%b8%d0%bc%d0%b8-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%b0%d0%bc%d0%b8-%d1%87%d0%b5%d1%80%d0%b5%d0%b7-%d0%b4%d0%b5%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%be%d1%80#comment328178_328132
@knoxx: Пробуйте. Если не подойдёт — там много вариантов, решение найдётся.
https://ru.stackoverflow.com/questions/328132/%d0%a1%d0%bf%d0%be%d1%81%d0%be%d0%b1%d1%8b-%d0%be%d0%b1%d1%89%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d0%b4%d0%be%d1%87%d0%b5%d1%80%d0%bd%d0%b8%d0%bc%d0%b8-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%b0%d0%bc%d0%b8-%d1%87%d0%b5%d1%80%d0%b5%d0%b7-%d0%b4%d0%b5%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%be%d1%80#comment328186_328132
у меня возникла проблемка: если два процесса читают фифошку, третий пишет в фифошку, то первым двум не всегда приходит то, что отсылалось третьим. Это можно побороть?
https://ru.stackoverflow.com/questions/328132/%d0%a1%d0%bf%d0%be%d1%81%d0%be%d0%b1%d1%8b-%d0%be%d0%b1%d1%89%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d0%b4%d0%be%d1%87%d0%b5%d1%80%d0%bd%d0%b8%d0%bc%d0%b8-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%b0%d0%bc%d0%b8-%d1%87%d0%b5%d1%80%d0%b5%d0%b7-%d0%b4%d0%b5%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%be%d1%80#comment328188_328132
@knoxx, что-то не так делаете. Сходу сишные примеры не нахожу, но вот посмотрите: dcs.ed.ac.uk/home/timh/PERL-CD/cookbook/ch16_11.htm Это perl, но наглядно, все возможные ситуации разобраны по косточкам, и практически 1:1 можно переносить на C. Основная идея в том, что каналы должны создаваться для каждой пары "родитель-потомок", никакой третий процесс в них вклиниваться не может по определению.
https://ru.stackoverflow.com/questions/328132/%d0%a1%d0%bf%d0%be%d1%81%d0%be%d0%b1%d1%8b-%d0%be%d0%b1%d1%89%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d0%b4%d0%be%d1%87%d0%b5%d1%80%d0%bd%d0%b8%d0%bc%d0%b8-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%b0%d0%bc%d0%b8-%d1%87%d0%b5%d1%80%d0%b5%d0%b7-%d0%b4%d0%b5%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%be%d1%80#comment328190_328132
@klopp, данная проблема на примере отсюда tldp.org/LDP/lpg/node18.html#SECTION00733000000000000000
https://ru.stackoverflow.com/questions/328132/%d0%a1%d0%bf%d0%be%d1%81%d0%be%d0%b1%d1%8b-%d0%be%d0%b1%d1%89%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d0%b4%d0%be%d1%87%d0%b5%d1%80%d0%bd%d0%b8%d0%bc%d0%b8-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%b0%d0%bc%d0%b8-%d1%87%d0%b5%d1%80%d0%b5%d0%b7-%d0%b4%d0%b5%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%be%d1%80#comment328194_328132
Очевидно, вам такой способ просто не подходит.
https://ru.stackoverflow.com/questions/328132/%d0%a1%d0%bf%d0%be%d1%81%d0%be%d0%b1%d1%8b-%d0%be%d0%b1%d1%89%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d0%b4%d0%be%d1%87%d0%b5%d1%80%d0%bd%d0%b8%d0%bc%d0%b8-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%b0%d0%bc%d0%b8-%d1%87%d0%b5%d1%80%d0%b5%d0%b7-%d0%b4%d0%b5%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%be%d1%80#comment328210_328132
P.S. Мне только что приглючился пул сообщений на базе shared memory :) Только нужно хорошо продумать протокол: от кого, кому, как отмечать полученные, и т.д. И ещё вариант: сам родитель работает как диспетчер сообщений. Ребёнок шлёт сообщение ему, с указанием адресата, а родитель уже разруливает кому его отсылать - конкретному, всем, группе и т.д. Тогда никаких дополнительных каналов создавать и не нужно.
https://ru.stackoverflow.com/questions/328132/%d0%a1%d0%bf%d0%be%d1%81%d0%be%d0%b1%d1%8b-%d0%be%d0%b1%d1%89%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d0%b4%d0%be%d1%87%d0%b5%d1%80%d0%bd%d0%b8%d0%bc%d0%b8-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%b0%d0%bc%d0%b8-%d1%87%d0%b5%d1%80%d0%b5%d0%b7-%d0%b4%d0%b5%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%be%d1%80#comment328211_328132
Попробуйте посмотреть как работает Хромиум (chromium.org ). В архитектуре хрома есть несколько типов процессов, которые общаются между собой по IPC, все команды передаются через "шариную память" (mmf). При большом желании часть кода из хрома можно вытащить отдельными библиотеками, и переиспользовать в своем проекте.

Ответы - Способы общения между дочерними процессами через дескриптор / Способы общения между дочерними процессами через дескриптор

dsnk

23.08.2015 08:28:32

Думаю это Ваш случай, очереди сообщений SVID IPC: msgget, msgctl, msgrcv, msgsnd, ... тут небольшой пример кода

https://ru.stackoverflow.com/questions/328132/%d0%a1%d0%bf%d0%be%d1%81%d0%be%d0%b1%d1%8b-%d0%be%d0%b1%d1%89%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d0%b4%d0%be%d1%87%d0%b5%d1%80%d0%bd%d0%b8%d0%bc%d0%b8-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%b0%d0%bc%d0%b8-%d1%87%d0%b5%d1%80%d0%b5%d0%b7-%d0%b4%d0%b5%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%be%d1%80/444708#comment470877_444708
Действительно, из-за этого изменения (MSG_COPY (since Linux 3.8), кстати, @dsnk, когда это произошло?) SVID IPC похоже можно применить, хотя это все же не файловый дескриптор о котором просил автор.
https://ru.stackoverflow.com/questions/328132/%d0%a1%d0%bf%d0%be%d1%81%d0%be%d0%b1%d1%8b-%d0%be%d0%b1%d1%89%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d0%b4%d0%be%d1%87%d0%b5%d1%80%d0%bd%d0%b8%d0%bc%d0%b8-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%b0%d0%bc%d0%b8-%d1%87%d0%b5%d1%80%d0%b5%d0%b7-%d0%b4%d0%b5%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%be%d1%80/444708#comment470878_444708
OK / ( Linux 3.8 was released on Mon, 18 Feb 2013) (даа, за полтора года до вопроса...) (и почему комментарий можно править только в течении 5 минут???)
https://ru.stackoverflow.com/questions/328132/%d0%a1%d0%bf%d0%be%d1%81%d0%be%d0%b1%d1%8b-%d0%be%d0%b1%d1%89%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d0%b4%d0%be%d1%87%d0%b5%d1%80%d0%bd%d0%b8%d0%bc%d0%b8-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%b0%d0%bc%d0%b8-%d1%87%d0%b5%d1%80%d0%b5%d0%b7-%d0%b4%d0%b5%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%be%d1%80/444708#comment470995_444708
@avp на сколько понял суть вопроса, требовался способ обмена сообщений между несколькими своими процессами.
https://ru.stackoverflow.com/questions/328132/%d0%a1%d0%bf%d0%be%d1%81%d0%be%d0%b1%d1%8b-%d0%be%d0%b1%d1%89%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d0%b4%d0%be%d1%87%d0%b5%d1%80%d0%bd%d0%b8%d0%bc%d0%b8-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%b0%d0%bc%d0%b8-%d1%87%d0%b5%d1%80%d0%b5%d0%b7-%d0%b4%d0%b5%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%be%d1%80/444708#comment470999_444708
Ну, да. Там в обсуждении в комментариях к вопросу кое-какие детали проявляются (правда мутновато, додумывать надо). Я и говорю, что теперь (поскольку можно прочесть не удаляя из очереди) вполне можно реализовать на SVID (только блокировки на логику выборки видимо надо делать).
Закрыть X