Какой способ IPC выбрать, если нужно передать данные (небольшой массив)
для еще не существующего процесса? При этом этого процесса может и не
быть вовсе.. Почитав статьи единственное подходящее на мой взгляд
Microsoft Message Queue, но возможно что-то попроще можно придумать?
Идеальный вариант для меня — это средство IPC позволяющее в асинхронном режиме
передавать данные, организованное как стек (последний пришёл — первый вышел).
При этом обмен должен происходить между разными процессами одного компьютера.
Спасибо.
Здравствуйте, Аноним, Вы писали:
А>Какой способ IPC выбрать, если нужно передать данные (небольшой массив) А>для еще не существующего процесса? При этом этого процесса может и не А>быть вовсе.. Почитав статьи единственное подходящее на мой взгляд А>Microsoft Message Queue, но возможно что-то попроще можно придумать? А>Идеальный вариант для меня — это средство IPC позволяющее в асинхронном режиме А>передавать данные, организованное как стек (последний пришёл — первый вышел). А>При этом обмен должен происходить между разными процессами одного компьютера.
Ещё можно в файл писать
Делай что должно, и будь что будет
Re[2]: Асинхронный IPC?
От:
Аноним
Дата:
05.04.06 09:35
Оценка:
Здравствуйте, SergH, Вы писали:
SH>Ещё можно в файл писать
Да, думал над этим — решил подумать еще
Re[3]: Асинхронный IPC?
От:
Аноним
Дата:
05.04.06 09:42
Оценка:
Здравствуйте, Аноним, Вы писали:
А> Да, думал над этим — решил подумать еще
Забыл аргументировать — не хочется чтобы что-то оставалось от работы, т.е. созданый файл могут и не прочитать/удалить.
Здравствуйте, Аноним, Вы писали:
А> Забыл аргументировать — не хочется чтобы что-то оставалось от работы, т.е. созданый файл могут и не прочитать/удалить.
Ну тут идея такая: чтобы сообщение шло асинхронно, оно должно где-то хранится. Есть встроенные механизмы: файлы, реестр, MSMQ. Пожалуй всё. Есть базы данных. Есть самопальные решения — навалять сервис, который будет работать промежуточным хранилищем.
>но возможно что-то попроще можно придумать?
можно поизвращаться — находим процесс, который создал окно GetDesktopWindow(), выделяем в нём память, пишем туда, чего надо, и назначаем адрес этой памяти в качестве какого-нть GUID-named свойства окну GetDesktopWindow() ...
правда,
0. нужно выяснить, является ли указатель на память выделенную VirtualAllocEx, переносимым между процессами
1. если память будет не востребована, то она может так и болтаться бесхозной...
2. не факт, что всегда будет доступ к процессу, который создал десктоп
Здравствуйте, Вумудщзук, Вы писали:
В>0. нужно выяснить, является ли указатель на память выделенную VirtualAllocEx, переносимым между процессами
Является.
В>1. если память будет не востребована, то она может так и болтаться бесхозной... В>2. не факт, что всегда будет доступ к процессу, который создал десктоп
Имхо, решение только для админа.
Делай что должно, и будь что будет
Re[2]: Асинхронный IPC?
От:
Аноним
Дата:
05.04.06 10:29
Оценка:
Здравствуйте, Вумудщзук, Вы писали:
В> выделяем в нём память, пишем туда, чего надо
Не поверите, пробовал ^^^^^^^^^^ На этом этапе фаервол говорит что процесс А пытается записать
данные в АП процесса Б (если Б имеет доступ к сети, т.е. для него создано правило).
> Не поверите, пробовал ^^^^^^^^^^ На этом этапе фаервол говорит что процесс А пытается записать > данные в АП процесса Б (если Б имеет доступ к сети, т.е. для него создано правило).
а, точно... вот гадство-то ? а зачем, интересно, процессу csrss.exe доступ к сети?
уже было замечено, что этот способ только для админа. если это не смущает, можно написать небольшой драйвер и качать данные через него
Здравствуйте, Вумудщзук, Вы писали:
В>уже было замечено, что этот способ только для админа. если это не смущает, можно написать небольшой драйвер и качать данные через него
Страсти какие! Драйвер! Зачем же так жестоко-то? Максимум — сервис.
>Страсти какие! Драйвер! Зачем же так жестоко-то? Максимум — сервис.
пасему жестоко ? пара строчек кода буквально... да и это всего лишь идея, чтоб топиккреатору было, из чего выбирать, раз в файлы/реестр писать не хочет
Здравствуйте, <Аноним>, Вы писали:
А>Какой способ IPC выбрать, если нужно передать данные (небольшой массив) А>для еще не существующего процесса?
dll с shared секцией данных — разделяется между процессами. Или MMF.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, Slava Antonov, Вы писали:
SA>Зачем? На уровне ядра и так общее адресное пространство.
Не понял, откуда ядро
обмен должен происходить между разными процессами одного компьютера.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
>dll с shared секцией данных — разделяется между процессами. Или MMF.
это если в какой-то момент они оба работают, а (насколько я понял ), может быть ситуация, когда один запустился, отработал, завершился, и только после него стартует второй
Здравствуйте, Abandoned, Вы писали:
>>dll с shared секцией данных — разделяется между процессами. Или MMF. A>это если в какой-то момент они оба работают, а (насколько я понял ), может быть ситуация, когда один запустился, отработал, завершился, и только после него стартует
Вообще-то, в этой ситуации самым простым (IMHO), представлявляется создание отдельного
приложения (пусть даже и не сервиса), обученного отдавать оные данные (LIFO)
по запросу, скажем, в ответ на SendMessage (и, например, хендл mmf).
В>>0. нужно выяснить, является ли указатель на память выделенную VirtualAllocEx, переносимым между процессами
SH>Является.
Это как? Память будет доступна только в адресном пространстве процесса, где она выделена. Максимум, что можно — это MMF.
Кстати, неплохое решение проблемы — именованый MMF. А еще лучше — ком сервер, который атоматически создается при первом обращении к соотв. функциям записи\чтения. Мы так делали, работало неплохо.
Здравствуйте, Andrew S, Вы писали:
В>>>0. нужно выяснить, является ли указатель на память выделенную VirtualAllocEx, переносимым между процессами
SH>>Является.
AS>Это как? Память будет доступна только в адресном пространстве процесса, где она выделена.
Конечно. Учти контекст, в котором задовался вопрос.
можно поизвращаться — находим процесс, который создал окно GetDesktopWindow(), выделяем в нём память, пишем туда, чего надо, и назначаем адрес этой памяти в качестве какого-нть GUID-named свойства окну GetDesktopWindow() ...
Т.е. алгоритм чтения — прочитать свойство, получить адрес, читать память процесса, в котором она выделена. А вопрос про переносимость адреса между процессами, насколько я понимаю, заключался в следующем: правда ли, что один и тот же кусок адресного пространства процесса виден всеми снаружи по одному и тому же адресу. Я написал что правда.
AS>Кстати, неплохое решение проблемы — именованый MMF.
Оно не до конца асинхронное.
AS>А еще лучше — ком сервер, который атоматически создается при первом обращении к соотв. функциям записи\чтения. Мы так делали, работало неплохо.
Здравствуйте, Аноним, Вы писали:
А>Какой способ IPC выбрать, если нужно передать данные (небольшой массив) А>для еще не существующего процесса? При этом этого процесса может и не А>быть вовсе.. Почитав статьи единственное подходящее на мой взгляд А>Microsoft Message Queue, но возможно что-то попроще можно придумать? А>Идеальный вариант для меня — это средство IPC позволяющее в асинхронном режиме А>передавать данные, организованное как стек (последний пришёл — первый вышел). А>При этом обмен должен происходить между разными процессами одного компьютера. А>Спасибо.
Предлагаю радикальное решение: использовать COM
Напишите небольшую программу сервер куда будут поступать данные.
А другие будут подключаться к этому серверу (через COM Remoting) и брать то что нужно.
Преимущество у этого решения в том что не нужно заморачиваться с тем как передавать данные, все автоматически будет за вас.