IPC, нужен совет

Тема в разделе "WASM.WIN32", создана пользователем nikhotmsk, 9 авг 2018.

Метки:
  1. nikhotmsk

    nikhotmsk New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    9
    Здравствуйте. Я пишу звукорежиссерскую программу для записи звука. Хочу чтобы она работала примерно одинаково на Linux и win32, поэтому основной язык разработки - Си.

    Прошу прощения, что лезу на форум про Ассемблер со своим Си кодом, но ведь Си и Ассемблер - это очень близкие вещи, верно? :)

    Написал тестовую прогу на линуксе, настало время портировать её на Win32. Для этого я взял MinGW.

    То, что мне нужно, это создать несколько дочерних процессов и настроить передачу сообщений между ними.

    Я прочитал вот это: https://wasm.in/blogs/ipc.291/
    Там написано, что сообщение WM_COPYDATA могут поймать другие программы, для которых оно не предназначено. Моя программа будет вызывать падение соседних программ. Круто.

    Чтобы послать кусок данных в дочерний процесс, нужно знать хэндл окна этого дочернего процесса, верно? А как его выяснить?

    Приходит на ум заставить дочерний процесс создать скрытое окно с уникальным именем, и слать сообщение туда, но что если запустить несколько инстанций моей программы? Возникнет путаница.

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

    Есть мысль: при запуске дочерний процесс пишет сообщение родительскому, но нужно знать хэндл родительского процесса. Но как узнать хэндл окна родительского процесса? Или как передать свой хендл в дочерний?

    Еще прочитал вот это: https://wasm.in/blogs/vzaimodejstvie-mezhdu-processami.127/

    Понравились атомы, но совершенно непонятно, как ими пользоваться. У атома есть строка, по которому другой процесс может его найти, еще есть номер, по которому к атому можно обратиться, чтобы стереть его. Как передать через него данные? Никак.

    Замапленые файлы? Хорошо. Имя файла во всех процессах будет одинаковое. А если рядом с программой запустить еще одну? Как они поделят между собой файл? Нужно передать дочернему процессу имя общего файла для работы. А как это правильно сделать?

    На Линуксе все привычно: создаешь пайпы, делаешь fork(), читаешь одновременно много пайпов через select(), и не нужно никаких очередей сообщений.

    Помогите новичку. Посоветуйте способ коммуникации между процессами. Какой вам больше нравится?

    Заранее большое-пребольшое спасибо.

    P.S. Поиск говорит, что не может найти результаты на запрос "IPC", потому что слово для поиска слишком короткое. Чтоб е*** :evil: Поиск по тэгам тоже не ищет. :-(

    В прочем, тэг "ipc" есть только у одного поста - у моего.
     
    Последнее редактирование: 9 авг 2018
  2. njeen

    njeen Active Member

    Публикаций:
    0
    Регистрация:
    26 мар 2017
    Сообщения:
    138
    Адрес:
    Ташлинск
    как это делается:
    смотрите в nix что из ipc есть, что в винде, сравниваете, чтобы соответствие было между выбранными.

    Конкретно что можно, например:
    - именованные пайпы под виндой и FIFO под nix
    - или что-то вроде shared memory + средство синхронизации , хоть семафор
     
  3. nikhotmsk

    nikhotmsk New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    9
    Семафор тут очень не желателен. Если все звукорежиссерские коробочки в студии будут ждать, пока у меня в real-time звуковом треде семафор разблокируется, будет очень плохо.

    В Линуксовой версии пайпов не будет, я решил отказаться от них в пользу сообщений.

    В винде тоже будут сообщения. Но вопрос остается: Как правильно передать хендл окна дочернему процессу? Через коммандную строку?
    То есть его надо перевести в hex, затем на том конце восстановить хендл из хекса, или можно прямо так? Как это взрослые дяди делают?

    Большое спасибо.
     
  4. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    860
    Создай файл-маппинг, и храни там глобальные данные. Дочерние процессы просто будут считывать эти данные, там же можно также организовывать передачу данных.
     
    Mikl___ нравится это.
  5. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    Mikl___ нравится это.
  6. superakira

    superakira Guest

    Публикаций:
    0
    nikhotmsk, у тебя уже не портабельно все. ты хочешь линукс а юзаешь виндовые кгуевые сообщения... странно мне это.

    Одумайся!!! =) Возьми Qt и не выдумывай лисапед. Все там уже за тебя написано и придумано в плане того что ты пытаешься реализовать.

    По ипс

    http://doc.qt.io/qt-5/ipc.html

    с примерами итд. на с++ но с qt можно писать как с с классами, за исключением шаблонных контейнеров и смартпоинтеров.
     
  7. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Ardour чем не угодил?
    JACK под Linux поддерживаете?
    А зачем вам создавать именно процессы, а не потоки?
     
  8. nikhotmsk

    nikhotmsk New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    9
    SadKo, просто хочу написать свою собственную. Это будет дипломная работа.
    В Линухе это будет как раз JACK клиент, который уже умеет коннектиться.

    Недавно нашел PortAudio, буду с ним возиться, он умеет и JACK, и ALSA. Может быть даже ASIO заработает.

    Хочу держать все в отдельных процессах, чтобы падение плагина не вызывало обрушение всего комплекса. Отдельно GUI, отдельно аудиопроцесс, отдельно VST.

    Ardour хорошая штука. Пашет. (На винде не пробовал)