C ++: можно ли поделиться указателем через разветвленные процессы? - PullRequest
4 голосов
/ 16 марта 2009

У меня есть переменная count, которая должна подсчитываться несколькими процессами, которые я разветвлял и использовал / считывал материнским процессом.

Я попытался создать указатель в моей функции main () материнского процесса и подсчитать этот указатель в разветвленных дочерних элементах. Это не работает! Кажется, что у каждого ребенка есть своя копия, хотя адрес во всех процессах одинаков.

Каков наилучший способ сделать это?

Ответы [ 7 ]

15 голосов
/ 16 марта 2009

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

Кстати, почему вы делаете это вики-сообществом - возможно, вы ограничиваете ответы этим.

2 голосов
/ 16 марта 2009

2 процесса не могут использовать одну и ту же память. Это правда, что разветвленный дочерний процесс будет совместно использовать ту же базовую память после разветвления, но попытка записи в него приведет к тому, что операционная система выделит для него новое место для записи где-то еще.

Посмотрите на другую форму IPC для использования.

1 голос
/ 17 марта 2009

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

Интерпроцесс повышения

, которая может дать вам представление о том, как распределять структурированные данные (читайте "классы" и "структуры") между процессами.

0 голосов
/ 16 марта 2009

Одной простой опцией, но ограниченной формой IPC, которая бы хорошо работала для общего подсчета, является «сегмент общих данных». В Windows это осуществляется с помощью директивы #pragma data_seg.

См. статью для примера.

0 голосов
/ 16 марта 2009

указатели всегда лежат в одном и том же процессе. Это приватно для процесса, относительно базового адреса процесса. Существуют различные виды механизмов IPC, доступные в любых операционных системах. Вы можете выбрать обмен сообщениями Windows, общую память, сокет, каналы и т. Д. Выберите один из них в соответствии с вашими требованиями и размером данных. Другой механизм - записывать данные в целевой процесс с использованием доступных API-интерфейсов виртуальной памяти и уведомлять процесс соответствующим указателем.

0 голосов
/ 16 марта 2009

Возможно, вы захотите проверить общую память.

0 голосов
/ 16 марта 2009

Нет, используйте IPC или темы. Совместно используются только файловые дескрипторы (но не указатель поиска).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...